2015-12-20 32 views
-1

逗人,我的RSA加密的结果不匹配,结果我从其他工具

我使用Java RSA程序使用私钥加密文本。然后我将输出发送到一个目标,该目标应该使用相应的公钥对其解密。为了确保我的加密结果是正确的(目的地实际上无法解密),我尝试使用本网站提供的工具上的相同按键输入来加密相同的数据:http://nmichaels.org/rsa.py

不幸的是我的结果与我在nmichaels.org上获得的不同。

这是我的源代码:

KeyFactory fact = KeyFactory.getInstance("RSA"); 
fact = KeyFactory.getInstance("RSA"); 
RSAPrivateKeySpec keySpec1 = new RSAPrivateKeySpec(
     new BigInteger("ddd2806f523c85fa7c87918ef54317b0e834c5dd75c33a1867ef40e4c9496dc2b2e0e0c332dc535a43e4caee867421957a5b901ad03d03eebc6a10dd400f03aaae90eeab4df5b64600a0346628f16ab0c9bbd639eb9163a21029d782eb024b28a46deb920fd969e5e11a28867be4cd578cd79d1adbf8f8af53eaf1a3186941c3657aa5ccaa9b16d5a264ed1afb32a739466c515f38a4c03614e618f93eab95ca860aa81a522ffca346204fe454d345c17aa220478334a769f80808ff5dd7aa06f5435920087b894164541319efc8af84ccfe269b3ad282f3b1121b2aab41156a510becad6c01538ebca625af80a131435cfc1a4193ff4535a87b358856ce9edb",16), 
     new BigInteger("7c4ae1307f51ee78a6a2880b249e8d7dd0ff1107c05ebe04c2e82ae2876f1f93830bc2a55db05afc2f22da1ac137fd4176a82b9cfaa5d5b845d6e0d0387eb13d484769948f4068fbdc89e8127e4a97cfab9a16b5a9ab73ba7178208bf906f5fa35f8699114546ca42477b5d175468550d358556da168666047935406613d495d1a1d20195b5db14f89dcf701a72bb63825ccbf6b26582c6c92e98fc5f0976572fe15c127e6b0a75e7037185e65e197c2f3c6e56d4078322abd15ffba1190cffc2f2e33c537d89e6c8212ae7bc5ad3f2f329cc19cba987a3d8ba96d6697713c8be4f6db08ae1f66e1e90f9a4d3b322d1511ba745d0567e88f62d4f6974a1ecfa1",16) 
     ); 

PrivateKey privKey = fact.generatePrivate(keySpec1); 

Cipher cipher = Cipher.getInstance("RSA"); 
cipher.init(Cipher.ENCRYPT_MODE, privKey); 
byte[] cipherData1 = cipher.doFinal("THIS_IS_THE_DATA_ENCRYPT".getBytes("UTF-8")); 

System.out.println("ciphered text (by priv key): " + byteArrayToHex(cipherData1)); 

我使用这个代码转换从字节数组为十六进制:

public static String byteArrayToHex(byte[] a) { 
     StringBuilder sb = new StringBuilder(a.length * 2); 
     for(byte b: a) 
      sb.append(String.format("%02x", b & 0xff)); 
     return sb.toString(); 
} 

上述代码的加密输出是:

ciphered text (by priv key): 02dc6ea9b0d9b8b3f3d072551981ee7f2050cad87b1556fc96e341b7718f4cde165fbcbf77dde65ffcde7d4f8f2ae4d7c79e327cedc39878a53845c661acc75aa007ff24860112361874ba38b5fa6422a1ec8ac2eaa302bf3235491cff4a5f172102c8b32989473cdbb59403a1d33e66d67b6bfd7e6db67565f7da6d05e80a41e25283335a66b6e8143ef8e5d78e0ca3e17d09641472da5d7a5d5c6a109764e6507865dc850b854eda05fe60a8f3be3620f370e37811c6dffc29082d58ff892f5aae629f6e1e7b6111821024671ed016497881a9a97d91cbe32c930805c742ec1b99127f5187f0bf5dc13a4bbd825c4a1211ac9f991e136a80b9f62a6654fe8e 

现在,转到nmichaels.org,我使用以下输入:

Modulus (Hex): ddd2806f523c85fa7c87918ef54317b0e834c5dd75c33a1867ef40e4c9496dc2b2e0e0c332dc535a43e4caee867421957a5b901ad03d03eebc6a10dd400f03aaae90eeab4df5b64600a0346628f16ab0c9bbd639eb9163a21029d782eb024b28a46deb920fd969e5e11a28867be4cd578cd79d1adbf8f8af53eaf1a3186941c3657aa5ccaa9b16d5a264ed1afb32a739466c515f38a4c03614e618f93eab95ca860aa81a522ffca346204fe454d345c17aa220478334a769f80808ff5dd7aa06f5435920087b894164541319efc8af84ccfe269b3ad282f3b1121b2aab41156a510becad6c01538ebca625af80a131435cfc1a4193ff4535a87b358856ce9edb 
Public exponent (Hex): 10001 
Private exponent (Hex): 7c4ae1307f51ee78a6a2880b249e8d7dd0ff1107c05ebe04c2e82ae2876f1f93830bc2a55db05afc2f22da1ac137fd4176a82b9cfaa5d5b845d6e0d0387eb13d484769948f4068fbdc89e8127e4a97cfab9a16b5a9ab73ba7178208bf906f5fa35f8699114546ca42477b5d175468550d358556da168666047935406613d495d1a1d20195b5db14f89dcf701a72bb63825ccbf6b26582c6c92e98fc5f0976572fe15c127e6b0a75e7037185e65e197c2f3c6e56d4078322abd15ffba1190cffc2f2e33c537d89e6c8212ae7bc5ad3f2f329cc19cba987a3d8ba96d6697713c8be4f6db08ae1f66e1e90f9a4d3b322d1511ba745d0567e88f62d4f6974a1ecfa1 
Data to encrypt (ASCII): THIS_IS_THE_DATA_ENCRYPT 

,并得到以下的输出:

0x55 0xf7 0x45 0x4d 0x98 0x69 0x48 0xcb 0xbc 0x64 0xea 0x87 0x1a 0x5c 0x51 0xa3 0xc4 0xe7 0xd9 0x31 0xa6 0x82 0x0b 0x91 0x14 0x0a 0x2a 0x15 0xa8 0x09 0xff 0x71 0x89 0xb4 0xac 0x22 0x9e 0x1e 0x5b 0x20 0x1e 0x9d 0xc7 0xb1 0xab 0xfb 0x19 0xb4 0x35 0x32 0x11 0x95 0x58 0x31 0x02 0xc3 0x34 0x56 0x3a 0x94 0x00 0x82 0x0b 0xf2 0xc3 0xda 0x8d 0xc3 0x62 0x17 0x29 0x4e 0x13 0x52 0x71 0x85 0x14 0xb3 0xa8 0x7d 0xca 0xc8 0xdd 0xde 0xfe 0xd0 0x06 0x9a 0xd5 0x2d 0x73 0x0f 0xe1 0x9b 0xb9 0x1c 0xa4 0xa5 0x56 0xbd 0xa3 0x4d 0x8d 0x93 0x7a 0x3f 0x46 0x4f 0x79 0xa0 0xb8 0x5e 0xa0 0x20 0xa2 0x06 0xdc 0x95 0x37 0x8a 0xa9 0xe5 0x3e 0x14 0x2f 0x28 0xe6 0xf8 0x8c 0x44 0xfd 0x6e 0x01 0x7f 0x13 0x78 0x31 0x93 0x9b 0xb3 0xa1 0xf9 0xed 0x3c 0x65 0x43 0xb0 0x2d 0xfa 0x8d 0x3b 0x38 0x59 0x51 0x9e 0x0b 0xbc 0xa6 0x28 0x5f 0x50 0x5c 0xa5 0x9c 0x69 0xf7 0x1c 0x6f 0xe9 0x69 0x95 0x78 0x84 0x04 0xd5 0x93 0x14 0x57 0xf8 0x84 0xc4 0x27 0x5b 0x97 0x57 0xf1 0x7f 0xa7 0x9a 0xba 0x06 0xc3 0x55 0x1f 0xfd 0xa3 0x1d 0xcf 0x40 0x36 0x7b 0x97 0x12 0x8f 0x11 0xa6 0xf8 0x8e 0xfb 0x26 0x75 0x58 0x70 0x12 0xf7 0x80 0xd2 0x2f 0x63 0x6f 0x00 0xb8 0xc9 0x7a 0xb6 0x6f 0x47 0x2f 0x58 0xd1 0x25 0xfe 0x22 0x44 0xee 0x86 0x3f 0x09 0x21 0xf1 0xeb 0x33 0x9f 0x62 0xea 0x3c 0x97 0xbd 0xdb 0x07 0xf8 0x0b 0xc7 0xe5 0xb2 0x54 

我试过其他在线工具,它给了同样的结果我得到了(http://nmichaels.org/rsa.py)。我应该做错了什么,但无法弄清楚。请提供您的帮助。

非常感谢。

+1

这个RSA密码最喜欢使用随机PKCS#1 v1.5填充类型2,所以尽管使用相同的密钥和明文,密文总是不同的。验证兼容性的唯一方法是加密一个并解密另一个。 –

回答

0

这是两个问题混合:

1)RSA加密与公共密钥进行(解密和签名是用私钥完成)

2)的Java应用PKCS#1填充到你的数据。

如果您使用在线工具从Java代码的输出加密,你会得到

0x01 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff   
[snip a lot of oxffs] 
0xff 0xff 0xff 0xff 0xff 0xff 0x00 0x54 0x48 0x49 0x53 0x5f 0x49 0x53 0x5f 0x54 
0x48 0x45 0x5f 0x44 0x41 0x54 0x41 0x5f 0x45 0x4e 0x43 0x52 0x59 0x50 0x54 

这是PKCS#1 v.1.5填充,然后你的明文的ASCII编码。

尝试使用公钥而不是私钥进行加密。

+0

非常感谢。它帮助了很多。 – ach