我的 RSA 加密结果与我从其他工具获得的结果不匹配

The result of my RSA encryption does not match with the result i am getting from other tools

亲爱的,

我正在使用 Java RSA 程序使用私钥加密文本。然后我将输出发送到目的地,该目的地应该使用相应的 public 密钥对其进行解密。为了确保我的加密结果是正确的(目的地实际上无法解密),我尝试使用本网站提供的工具输入相同的密钥来加密相同的数据: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 加密是用 public 密钥完成的(解密和签名是用私钥完成的)

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 编码。

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