RSA解密时javax.crypto.BadPaddingException: Data must start with zero

转载 2015年11月17日 19:43:43
解决方法:要在加密后产生的byte数组转成string时要在各byte之间加个标识符,我加了个空格,
然后再根据空格分隔转换回byte数组。如果不加标识符,由于byte值可能是一位到三位,无法知道某一个byte是在哪里结束。当然也可以在转成string时补0。或者转成16进制固定为两位长。


code:
public class RSATest {

   public static void main(String[] args) {
       try {
           RSATest encrypt = new RSATest();

           KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
           keyPairGen.initialize(1024);
           KeyPair keyPair = keyPairGen.generateKeyPair();
           RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
           RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();

           String str = "Hello World!";
           System.out.println("String will be encrypted: " + str);
           byte[] e = encrypt.encrypt(publicKey, str.getBytes());
           String tmp1 = encrypt.bytesToString(e);
           System.out
                   .println("encrypted String's bytes, use
bytesToString() method convert bytes to string:  " + tmp1);
           String[] strArr = tmp1.split(" ");
           int len = strArr.length;
           byte[] clone = new byte[len];
           for (int i = 0; i < len; i++) {
               clone[i] = Byte.parseByte(strArr[i]);
           }

           System.out.println("convert to String, then back to bytes
again: " + encrypt.bytesToString(clone));
           byte[] d = encrypt.decrypt(privateKey, clone);
           System.out.println("decrypted String's bytes, use
bytesToString() method convert bytes to string:"
                   + encrypt.bytesToString(d));
           System.out.println("construct a string by decrypted
string's bytes: " + new String(d));
       } catch (Exception e) {
           e.printStackTrace();
       }
   }

   protected String bytesToString(byte[] encrytpByte) {
       String result = "";
       for (Byte bytes : encrytpByte) {
           result += bytes.toString() + " ";
       }
       return result;
   }


   protected byte[] encrypt(RSAPublicKey publicKey, byte[] obj) {
       if (publicKey != null) {
           try {
               Cipher cipher = Cipher.getInstance("RSA");
               cipher.init(Cipher.ENCRYPT_MODE, publicKey);
               return cipher.doFinal(obj);
           } catch (Exception e) {
               e.printStackTrace();
           }
       }
       return null;
   }

   protected byte[] decrypt(RSAPrivateKey privateKey, byte[] obj) {
       if (privateKey != null) {
           try {
               Cipher cipher = Cipher.getInstance("RSA");
               cipher.init(Cipher.DECRYPT_MODE, privateKey);
               return cipher.doFinal(obj);
           } catch (Exception e) {
               e.printStackTrace();
           }
       }
       return null;
   }
}

运行结果:
String will be encrypted: Hello World!
encrypted String's bytes, use bytesToString() method convert bytes to
string:  79 62 -105 -47 -61 45 64 -11 -8 -120 30 31 37 -111 49 -30 88
-12 93 -77 3 39 -13 -18 68 -104 0 30 85 26 104 15 -126 -39 12 110 -84
68 -43 73 35 121 -20 -69 -84 85 -33 -123 -48 -68 -85 -106 41 -84 20
-17 87 -81 42 -67 -87 122 -2 37 74 27 103 112 58 -125 -87 -32 96 -56
65 -2 -103 -28 70 107 2 28 87 75 -8 -62 54 12 -7 -108 -123 120 -63 -83
13 -89 -21 58 -51 -84 66 25 103 -114 -14 110 80 58 74 95 -57 -73 -78
-46 56 -83 -72 -38 2 43 25 12 56 12 101 15 91 -37
convert to String, then back to bytes again: 79 62 -105 -47 -61 45 64
-11 -8 -120 30 31 37 -111 49 -30 88 -12 93 -77 3 39 -13 -18 68 -104 0
30 85 26 104 15 -126 -39 12 110 -84 68 -43 73 35 121 -20 -69 -84 85
-33 -123 -48 -68 -85 -106 41 -84 20 -17 87 -81 42 -67 -87 122 -2 37 74
27 103 112 58 -125 -87 -32 96 -56 65 -2 -103 -28 70 107 2 28 87 75 -8
-62 54 12 -7 -108 -123 120 -63 -83 13 -89 -21 58 -51 -84 66 25 103
-114 -14 110 80 58 74 95 -57 -73 -78 -46 56 -83 -72 -38 2 43 25 12 56
12 101 15 91 -37
decrypted String's bytes, use bytesToString() method convert bytes to
string:72 101 108 108 111 32 87 111 114 108 100 33
construct a string by decrypted string's bytes: Hello World!

相关文章推荐

RSA解密时BadPaddingException解决方法

工作的时候遇到程序需要进行RSA加密解密的部分,在写第一版测试的时候,出现了:Exception in thread "main" javax.crypto.BadPaddingException: ...

Java安全架构____RSA加密配置第三方加密库问题_javax.crypto.BadPaddingException: Decryption error

刚要写一个JCE组件是未使用第三方加密库时 bug如下 javax.crypto.BadPaddingException: Decryption error at sun.security.rsa...

RSA Data must start with zero问题解决方法

RSA工具使用公钥加密之后生成byte[] ,直接解密是没有问题的,但将byte[]通过Base64.encode(byte[])之后得到的字符串重新getBytes()去解密是会出现RSA Data...

利用java api 实现 RSA算法 解决(javax.crypto.BadPaddingException: Data must start with zero)

利用java api 实现 RSA算法 解决(javax.crypto.BadPaddingException: Data must start with zero) /* * ABc...

Data must start with zero

解决: //注意, 如果用公钥加密, 就得用私钥解密, 如果用私钥加密, 就用公钥解密public static void main(String[] args) throws Exception ...

SRA解密报错:Data must start with zero

项目背景:要对打印地址进行加密,用公钥加密后会乱码需要base64 decode一下,但是在解密时报错:javax.crypto.BadPaddingException: Data must star...

Linux下运行java DES解密失败,报javax.crypto.BadPaddingException:Given final block not properly padded

DES java源代码如下: import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmExcep...
  • rj042
  • rj042
  • 2012-11-18 14:04
  • 50650

Linux下运行java DES解密失败,报javax.crypto.BadPaddingException:Given final block not properly padded

1、报错内容 avax.crypto.BadPaddingException: Given final block not properly padded at com.sun.crypto.pr...

javax.crypto.BadPaddingException: error:0407106B:rsa routines:RSA_padding_check_PKCS1_type_2:block t

RSA超过长度时报这个错,解决方法是  加密使用117 解密使用128 public static byte[] encryptByPublicKey(byte[] data, Publi...

javax.crypto.IllegalBlockSizeException: Input length must be multiple of 8 when decrypting with padd

Caused by: javax.crypto.IllegalBlockSizeException: Input length must be multiple of 8 when decryptin...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)