zoukankan      html  css  js  c++  java
  • RSA解密时javax.crypto.BadPaddingException: Data must start with zero

    解决方法:要在加密后产生的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!

  • 相关阅读:
    Codeforces Round #494 (Div. 3) D. Coins and Queries (贪心,数学)
    Codeforces Round #645 (Div. 2) D. The Best Vacation (贪心,二分)
    Codeforces Round #481 (Div. 3) F. Mentors (模拟,排序)
    Codeforces Round #646 (Div. 2) B. Subsequence Hate (思维,前缀和)
    windows的类似shell 命令操作 风行天下
    Linux防火墙iptables的策略 风行天下
    HP服务器安装配置教程 风行天下
    zabbix 监控数据库 及 tcp连接数 风行天下
    Linux日志 风行天下
    CENTOS 挂载ntfs移动硬盘 风行天下
  • 原文地址:https://www.cnblogs.com/jpfss/p/10037850.html
Copyright © 2011-2022 走看看