现在遇到了这个一个问题
首先环境说明一下
解密的一方是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.   

    从楼主描述的内容看,大体上的逻辑是没什么问题的。问题都是在细节上。有两个建议:1. RSA 加解密的时候,不止需要公私钥,还有一些控制参数需要注意,比如有个 padding 的东西,两边要一致的。2. 先在 VC6 这边做一个解密程序,成功后,在 Java 那边比照着做,就会容易一些了。
      

  2.   

    谢谢!
    1、
    padding这个东西是用来干吗的呢?可以详细说一下吗?我再去查一下资料另外,加解密的块长度,加解密的算法长度等等都是一致的2、在两边用各自的库的话,加解密都没有问题
      

  3.   

    关于 padding:其实我对 RSA 等加密算法的了解也不深入,仅停留在照猫画虎的使用层面  :)由于 RSA 是基于 block 的加密算法(而不是基于 stream 的),它每次加密的源数据都是等宽的(比如 1024 位密钥就是对 128 字节的源数据进行加密),对于不足的字节数就需要“填充”,这个 padding 就指定了“填充”的算法。所以,当然在解密的时候也得用相同的“填充”算法才可以。既然你在 VC 这边做解密没有问题,那么就对照着看一下 Java 这边的解密程序喽。虽然编程语言不同,但 RSA 解密的概念是一致的,接口调用形式也应该差不多,主要对照一下相关的入口参数……