A端请求加密、BASE64编码;
B端响应BASE64解码、解密;
A端使用jdk1.4,这个版本本身没有支持非对称加解密的provider,所以需要自己下载一个,我下载了bcprov-jdk14-146.jar,并在加密中手动添加provider,代码:Security.addProvider(new BouncyCastleProvider());B端使用jdk1.5或者jdk1.6,这两个版本都有自带的provider,所以不需要下载。解密的时候报错:javax.crypto.BadPaddingException: Blocktype mismatch: 0
经测试,使用同样的证书、同样的字符串在AB两种环境下分别加密编码后的结果是不一样的,个人怀疑是否因为不同的provider引起的。求解!

解决方案 »

  1.   


             String author = new sun.misc.BASE64Encoder()
                   .encode((username + ":" + password).getBytes());
      

  2.   


    是非对称加解密问题,不是BASE64。传输必须要BASE64编码,所以也顺便加上了。
      

  3.   

    分别打印出了publickey:jdk1.4的结果
    SunJSSE RSA public key:
      public exponent:
        010001
      modulus:
        bc0ccd5d cc4c345a 709ff33f 8bcd4d13 e37799f5 3a912a81 53042315 dc3c1a1a
        bcdc7e66 6b3e9777 a39054dd a0cd2bc1 09af73f5 4ac3c9bd 9ce5d5d5 5e433a0c
        b3127231 e6c94518 a35f74bd eba18fc3 90f75cb9 c79c6150 22fe4b62 b3bc50e2
        d73ef1c5 3d5a9744 2bcea183 ca93ee6e 0d5b7354 de4d9a43 5f74ba04 adc8ddc5
    jdk1.6的结果
    Sun RSA public key, 1024 bits
      modulus: 132053206854501194529198893014497803582559064011271546463649493611754935055036000686091595242850003164098069583185587582185708037868412612334407384335825151453091261383984392005114549213331568712500752483198891711391754491395260463629012823023138918029303329610829336144310608420098441937607062820265185041861
      public exponent: 65537
      

  4.   

    B端使用jdk1.5或者jdk1.6  使用下和jdk1.4相同的provider看看吧。
      

  5.   

    最要命的是在B端jdk1.6环境下同样的证书、同样的被加密字符串每次加密后编码后的字符串还不一样!
    A端jdk1.4下测试加密编码每次的结果都是相同的。
      

  6.   

    lz,java怎么才能读到证书里面的密钥呢,求教啊