2016-01-24 129 views
1

所以我有一个字节数组,我要加密使用RSA这个数组,但我也想离开第一个字节触及这样的:的Java,RSA加密

//Before encryption: 
byteArray[0] = 1; 
byteArray[1] = 0; 
byteArray[2] = 1; 

//After encryption: 
byteArray[0] = 1; //untouched 
byteArray[1] = -127; //encrypted 
byteArray[2] = 230; //encrypted 

哪个doFinal的方法,我应该使用?

@edit 为什么这不起作用?

 try 
     { 
      byte[] pack = new byte[4]; 
      byte[] pack2; 
      byte[] pack3; 
      pack[0] = 1; 
      pack[1] = 2; 
      pack[2] = 3; 
      pack[3] = 4; 

      System.out.println("START!"); 
      for(int i = 0; i < 4; i++) 
      { 
       System.out.println(pack[i]); 
      } 

      KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); 
      keyPairGenerator.initialize(512); 
      KeyPair keyPair = keyPairGenerator.genKeyPair(); 

      Cipher cip = Cipher.getInstance("RSA"); 
      cip.init(Cipher.ENCRYPT_MODE, keyPair.getPublic()); 
      pack2 = cip.doFinal(pack, 1, pack.length-1); 
      for(int i = 0; i < 4; i++) 
      { 
       System.out.println(pack2[i]); 
      } 

      Cipher cip2 = Cipher.getInstance("RSA"); 
      cip2.init(Cipher.DECRYPT_MODE, keyPair.getPrivate()); 
      pack3 = cip2.doFinal(pack2, 1, pack2.length-1); 
      for(int i = 0; i < 4; i++) 
      { 
       System.out.println(pack3[i]); 
      } 

      System.out.println("END!"); 

     } 
     catch(Exception e) 
     { 
      e.printStackTrace(); 
     } 

和输出是:

START! 
1 
2 
3 
4 
111 
-44 
120 
103 
java.lang.ArrayIndexOutOfBoundsException: 3 

回答

2

我已经更新了一下你的代码。查找我插入的评论。

实质上,当您加密时,RSA返回的数据块(密文)明显大于您的数据(纯文本)。这是设计。在你的情况下,因为你的密钥长度是512位,你可以期望一个512位(64字节)的输出块来加密纯文本。要破译密文,您必须使用整个密文块来执行解密。

try 
{ 
    byte[] pack = new byte[4]; 
    byte[] pack2; 
    byte[] pack3; 
    pack[0] = 1; 
    pack[1] = 2; 
    pack[2] = 3; 
    pack[3] = 4; 

    System.out.println("START!"); 
    System.out.println("pack"); 
    for(int i = 0; i < 4; i++) 
    { 
     System.out.println(pack[i]); 
    } 
    System.out.println(""); 

    KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); 
    keyPairGenerator.initialize(512); 
    KeyPair keyPair = keyPairGenerator.genKeyPair(); 

    Cipher cip = Cipher.getInstance("RSA"); 
    cip.init(Cipher.ENCRYPT_MODE, keyPair.getPublic()); 
    // I think you said you wanted the last 3 bytes encrypted 
    //      vvvvvvvvvvvvvvvv 
    pack2 = cip.doFinal(pack, 1, pack.length-1); 
    System.out.println("pack2"); 
    for(int i = 0; i < 4; i++) 
    { 
     System.out.println(pack2[i]); 
    } 
    System.out.println(""); 

    Cipher cip2 = Cipher.getInstance("RSA"); 
    cip2.init(Cipher.DECRYPT_MODE, keyPair.getPrivate()); 
    byte[] pack3Tmp= cip2.doFinal(pack2, 0, pack2.length); 
    pack3= new byte[pack.length]; 
    // Copy over the first byte you had mentioned to be 
    // unecrypted 
    pack3[0]= pack[0]; 
    // Use System.arraycopy 
    //    Source is pack3Tmp 
    //    |   Starting offset is 0 
    //    |   | Destination is pack3 
    //    |   | |  Staring offset in pack3 is 1 
    //    |   | |  | Copy all of pack3Tmp 
    //    |   | |  | | 
    //    v   v v  v v 
    System.arraycopy(pack3Tmp, 0, pack3, 1, pack3Tmp.length); 
    System.out.println("pack3"); 
    for(int i = 0; i < 4; i++) 
    { 
     System.out.println(pack3[i]); 
    } 
    System.out.println(""); 

    System.out.println("END!"); 
} 
catch(Exception e) 
{ 
    e.printStackTrace(); 
} 
+0

不,因为用户声明pack []的第一个字节没有加密。但pack3Tmp是解密的结果。加密是3个字节,所以你的解密输出是3个字节。 –

+0

对不起,是的。错过了这是解密,而不是加密,因为滚动很多。 –

0

应使用byte[] doFinal(byte[] input, int inputOffset, int inputLen)指定1作为输入偏移和阵列作为输入长度的长度。

你的情况:doFinal(byteArray, 1, byteArray.length)

2

这有什么好做RSA,这只是基本的Java编程错误。 pack2[0]pack2[pack2.length-1]包含通过pack[pack.length-1]加密pack[1]的结果。因此,为了成功解密,您必须提供pack2[0]pack2[pack2.length-1]。由于您提供的解码器pack2开始pack2[1]您的代码应该抛出一个解密错误异常,而不是您报告的异常。因此,我还必须得出结论,您提供的代码和您提供的输出不会在一起。

如果您想将pack的第一个字节复制到pack2,您必须自己做,也许需要Arrays.copy *()方法和/或System.arraycopy()之一的帮助。