现在遇到了这个一个问题
首先环境说明一下
解密的一方是linux下,用java的,公钥由这方提供
加密的一方是windows,用VC6的,现在出现了问题
加密:用windows CryptoAPI
由解密方提供公钥,其中包括e和n,然后按照
PUBLICKEYSTRUC publickeystruc ;
RSAPUBKEY rsapubkey;
BYTE modulus[rsapubkey.bitlen/8];
这样的格式填充得到加密用的公钥
然后用CryptEncrypt加密
解密:
java.security.spec.RSAPublicKeySpec;
java.security.spec.RSAPrivateKeySpec;
java.security.spec.InvalidKeySpecException;
java.security.interfaces.RSAPrivateKey;
java.security.interfaces.RSAPublicKey;
用的是几个库,但是加密的东西解密出错了,解不开明文
请问各位大大,这样做合理吗?
如果不合理的话请指出那个地方需要更正的。。。
另外有那位大大有这方面经验的,请指教一二,万分感谢。。
------解决方案--------------------
从楼主描述的内容看,大体上的逻辑是没什么问题的。问题都是在细节上。
有两个建议:
1. RSA 加解密的时候,不止需要公私钥,还有一些控制参数需要注意,比如有个 padding 的东西,两边要一致的。
2. 先在 VC6 这边做一个解密程序,成功后,在 Java 那边比照着做,就会容易一些了。
------解决方案--------------------
关于 padding:
其实我对 RSA 等加密算法的了解也不深入,仅停留在照猫画虎的使用层面 :)
由于 RSA 是基于 block 的加密算法(而不是基于 stream 的),它每次加密的源数据都是等宽的(比如 1024 位密钥就是对 128 字节的源数据进行加密),对于不足的字节数就需要“填充”,这个 padding 就指定了“填充”的算法。
所以,当然在解密的时候也得用相同的“填充”算法才可以。
既然你在 VC 这边做解密没有问题,那么就对照着看一下 Java 这边的解密程序喽。虽然编程语言不同,但 RSA 解密的概念是一致的,接口调用形式也应该差不多,主要对照一下相关的入口参数……