diff --git a/hutool-crypto/src/test/java/cn/hutool/crypto/asymmetric/IssueI6OQJATest.java b/hutool-crypto/src/test/java/cn/hutool/crypto/asymmetric/IssueI6OQJATest.java new file mode 100644 index 000000000..4e48fd011 --- /dev/null +++ b/hutool-crypto/src/test/java/cn/hutool/crypto/asymmetric/IssueI6OQJATest.java @@ -0,0 +1,23 @@ +package cn.hutool.crypto.asymmetric; + +import cn.hutool.crypto.SecureUtil; +import org.junit.Assert; +import org.junit.Test; + +@SuppressWarnings("FieldCanBeLocal") +public class IssueI6OQJATest { + + private static final String privateKey = "MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAOgjgkzy33Kg3XzV4r0dpa3o6klM85TVn5jS6woBsTRuU0SsDJzqjXdF34G9uZgbHN74RHoOjO2sRM98tnjEJ8WvqqPBOimvpBeTqVGrWRXtelXhPXaSfYdipGIp2stHr270GTg5+chTrfOn7rp1PA09AoRM+HULaU31St0wntf/AgMBAAECgYBwb9qJ6M1f2RjOgU58aSK5dGoeLN6CRWIzBF4Bj8ZD7ff4+Bh33Ie+sKJMVhfR27gFK10HfYq3B8ygbvh20BOumU9U6xFMOff5yPjOoCAFfa7k69hjPaq8Ls/H9kT4sG+djZAyc43JVjUv0J9VFRlCtgEJHNpWUlTPLaqc+1ScEQJBAP1Ewd2nStmXjgHeMiB+NBhY0QSIN5HBW07MlmsMbJir+OWN0t8YKoYZXynei6UDu6wrwTCCDRhcSCpFy9bA9+cCQQDqpGouK8zhvcM/yT1C+f/Hh9cFIlqLKsHssmSva0lTKVE5O7104VXEwNjufjRwaGLc0bRgs/aJh8W7EcGp2zwpAkEAjsk40xIB7PK4qOzwLcl47VEFZhy114K/S4mkM+3pO5mY1TJD9GrXborXT++bowibwdFZNVPctiMwvERlS0m3eQJBAKEKvyV5QmEdEMjSoY06cGbNwLHxZhtl+TsvJROQmv7MuMaDTgDON0OW6Eynqe4Mdu3/r8E/QtIZsYg3I6gkpCECQQDijoNBop46kR/udUEPCaMjy3lzUVklAGAMKE+mc7n50+A3CeMDXAYU/OCf7vMjo2Uq44CE/yIHtYURn0usCzoB"; + private static final String publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDoI4JM8t9yoN181eK9HaWt6OpJTPOU1Z+Y0usKAbE0blNErAyc6o13Rd+BvbmYGxze+ER6DoztrETPfLZ4xCfFr6qjwTopr6QXk6lRq1kV7XpV4T12kn2HYqRiKdrLR69u9Bk4OfnIU63zp+66dTwNPQKETPh1C2lN9UrdMJ7X/wIDAQAB"; + + @Test + public void genKeyTest() { + Assert.assertEquals(passCryto("123"), passCryto("123")); + } + + @SuppressWarnings("SameParameterValue") + private String passCryto(final String value){ + return SecureUtil.rsa(privateKey, publicKey) + .encryptBase64(value, KeyType.PrivateKey); + } +} diff --git a/hutool-crypto/src/test/java/cn/hutool/crypto/asymmetric/RSATest.java b/hutool-crypto/src/test/java/cn/hutool/crypto/asymmetric/RSATest.java index 6f962c6c5..074b345a2 100644 --- a/hutool-crypto/src/test/java/cn/hutool/crypto/asymmetric/RSATest.java +++ b/hutool-crypto/src/test/java/cn/hutool/crypto/asymmetric/RSATest.java @@ -25,27 +25,27 @@ public class RSATest { @Test public void generateKeyPairTest() { - KeyPair pair = KeyUtil.generateKeyPair("RSA"); + final KeyPair pair = KeyUtil.generateKeyPair("RSA"); Assert.assertNotNull(pair.getPrivate()); Assert.assertNotNull(pair.getPublic()); } @Test public void rsaCustomKeyTest() { - KeyPair pair = KeyUtil.generateKeyPair("RSA"); - byte[] privateKey = pair.getPrivate().getEncoded(); - byte[] publicKey = pair.getPublic().getEncoded(); + final KeyPair pair = KeyUtil.generateKeyPair("RSA"); + final byte[] privateKey = pair.getPrivate().getEncoded(); + final byte[] publicKey = pair.getPublic().getEncoded(); - RSA rsa = SecureUtil.rsa(privateKey, publicKey); + final RSA rsa = SecureUtil.rsa(privateKey, publicKey); // 公钥加密,私钥解密 - byte[] encrypt = rsa.encrypt(StrUtil.bytes("我是一段测试aaaa", CharsetUtil.CHARSET_UTF_8), KeyType.PublicKey); - byte[] decrypt = rsa.decrypt(encrypt, KeyType.PrivateKey); + final byte[] encrypt = rsa.encrypt(StrUtil.bytes("我是一段测试aaaa", CharsetUtil.CHARSET_UTF_8), KeyType.PublicKey); + final byte[] decrypt = rsa.decrypt(encrypt, KeyType.PrivateKey); Assert.assertEquals("我是一段测试aaaa", StrUtil.str(decrypt, CharsetUtil.CHARSET_UTF_8)); // 私钥加密,公钥解密 - byte[] encrypt2 = rsa.encrypt(StrUtil.bytes("我是一段测试aaaa", CharsetUtil.CHARSET_UTF_8), KeyType.PrivateKey); - byte[] decrypt2 = rsa.decrypt(encrypt2, KeyType.PublicKey); + final byte[] encrypt2 = rsa.encrypt(StrUtil.bytes("我是一段测试aaaa", CharsetUtil.CHARSET_UTF_8), KeyType.PrivateKey); + final byte[] decrypt2 = rsa.decrypt(encrypt2, KeyType.PublicKey); Assert.assertEquals("我是一段测试aaaa", StrUtil.str(decrypt2, CharsetUtil.CHARSET_UTF_8)); } @@ -60,14 +60,14 @@ public class RSATest { Assert.assertNotNull(rsa.getPrivateKeyBase64()); // 公钥加密,私钥解密 - byte[] encrypt = rsa.encrypt(StrUtil.bytes("我是一段测试aaaa", CharsetUtil.CHARSET_UTF_8), KeyType.PublicKey); + final byte[] encrypt = rsa.encrypt(StrUtil.bytes("我是一段测试aaaa", CharsetUtil.CHARSET_UTF_8), KeyType.PublicKey); - byte[] decrypt = rsa.decrypt(encrypt, KeyType.PrivateKey); + final byte[] decrypt = rsa.decrypt(encrypt, KeyType.PrivateKey); Assert.assertEquals("我是一段测试aaaa", StrUtil.str(decrypt, CharsetUtil.CHARSET_UTF_8)); // 私钥加密,公钥解密 - byte[] encrypt2 = rsa.encrypt(StrUtil.bytes("我是一段测试aaaa", CharsetUtil.CHARSET_UTF_8), KeyType.PrivateKey); - byte[] decrypt2 = rsa.decrypt(encrypt2, KeyType.PublicKey); + final byte[] encrypt2 = rsa.encrypt(StrUtil.bytes("我是一段测试aaaa", CharsetUtil.CHARSET_UTF_8), KeyType.PrivateKey); + final byte[] decrypt2 = rsa.decrypt(encrypt2, KeyType.PublicKey); Assert.assertEquals("我是一段测试aaaa", StrUtil.str(decrypt2, CharsetUtil.CHARSET_UTF_8)); } @@ -82,14 +82,14 @@ public class RSATest { Assert.assertNotNull(rsa.getPrivateKeyBase64()); // 公钥加密,私钥解密 - byte[] encrypt = rsa.encrypt(StrUtil.bytes("我是一段测试aaaa", CharsetUtil.CHARSET_UTF_8), KeyType.PublicKey); + final byte[] encrypt = rsa.encrypt(StrUtil.bytes("我是一段测试aaaa", CharsetUtil.CHARSET_UTF_8), KeyType.PublicKey); - byte[] decrypt = rsa.decrypt(encrypt, KeyType.PrivateKey); + final byte[] decrypt = rsa.decrypt(encrypt, KeyType.PrivateKey); Assert.assertEquals("我是一段测试aaaa", StrUtil.str(decrypt, CharsetUtil.CHARSET_UTF_8)); // 私钥加密,公钥解密 - byte[] encrypt2 = rsa.encrypt(StrUtil.bytes("我是一段测试aaaa", CharsetUtil.CHARSET_UTF_8), KeyType.PrivateKey); - byte[] decrypt2 = rsa.decrypt(encrypt2, KeyType.PublicKey); + final byte[] encrypt2 = rsa.encrypt(StrUtil.bytes("我是一段测试aaaa", CharsetUtil.CHARSET_UTF_8), KeyType.PrivateKey); + final byte[] decrypt2 = rsa.decrypt(encrypt2, KeyType.PublicKey); Assert.assertEquals("我是一段测试aaaa", StrUtil.str(decrypt2, CharsetUtil.CHARSET_UTF_8)); } @@ -104,14 +104,14 @@ public class RSATest { Assert.assertNotNull(rsa.getPrivateKeyBase64()); // 公钥加密,私钥解密 - byte[] encrypt = rsa.encrypt(StrUtil.bytes("我是一段测试aaaa", CharsetUtil.CHARSET_UTF_8), KeyType.PublicKey); + final byte[] encrypt = rsa.encrypt(StrUtil.bytes("我是一段测试aaaa", CharsetUtil.CHARSET_UTF_8), KeyType.PublicKey); - byte[] decrypt = rsa.decrypt(encrypt, KeyType.PrivateKey); + final byte[] decrypt = rsa.decrypt(encrypt, KeyType.PrivateKey); Assert.assertEquals("我是一段测试aaaa", StrUtil.str(decrypt, CharsetUtil.CHARSET_UTF_8)); // 私钥加密,公钥解密 - byte[] encrypt2 = rsa.encrypt(StrUtil.bytes("我是一段测试aaaa", CharsetUtil.CHARSET_UTF_8), KeyType.PrivateKey); - byte[] decrypt2 = rsa.decrypt(encrypt2, KeyType.PublicKey); + final byte[] encrypt2 = rsa.encrypt(StrUtil.bytes("我是一段测试aaaa", CharsetUtil.CHARSET_UTF_8), KeyType.PrivateKey); + final byte[] decrypt2 = rsa.decrypt(encrypt2, KeyType.PublicKey); Assert.assertEquals("我是一段测试aaaa", StrUtil.str(decrypt2, CharsetUtil.CHARSET_UTF_8)); } @@ -127,37 +127,37 @@ public class RSATest { Assert.assertNotNull(rsa.getPrivateKeyBase64()); // 公钥加密,私钥解密 - byte[] encrypt = rsa.encrypt(StrUtil.bytes("我是一段测试aaaa", CharsetUtil.CHARSET_UTF_8), KeyType.PublicKey); - byte[] decrypt = rsa.decrypt(encrypt, KeyType.PrivateKey); + final byte[] encrypt = rsa.encrypt(StrUtil.bytes("我是一段测试aaaa", CharsetUtil.CHARSET_UTF_8), KeyType.PublicKey); + final byte[] decrypt = rsa.decrypt(encrypt, KeyType.PrivateKey); Assert.assertEquals("我是一段测试aaaa", StrUtil.str(decrypt, CharsetUtil.CHARSET_UTF_8)); // 私钥加密,公钥解密 - byte[] encrypt2 = rsa.encrypt(StrUtil.bytes("我是一段测试aaaa", CharsetUtil.CHARSET_UTF_8), KeyType.PrivateKey); - byte[] decrypt2 = rsa.decrypt(encrypt2, KeyType.PublicKey); + final byte[] encrypt2 = rsa.encrypt(StrUtil.bytes("我是一段测试aaaa", CharsetUtil.CHARSET_UTF_8), KeyType.PrivateKey); + final byte[] decrypt2 = rsa.decrypt(encrypt2, KeyType.PublicKey); Assert.assertEquals("我是一段测试aaaa", StrUtil.str(decrypt2, CharsetUtil.CHARSET_UTF_8)); } @Test public void rsaBcdTest() { - String text = "我是一段测试aaaa"; + final String text = "我是一段测试aaaa"; final RSA rsa = new RSA(); // 公钥加密,私钥解密 - String encryptStr = rsa.encryptBcd(text, KeyType.PublicKey); - String decryptStr = StrUtil.utf8Str(rsa.decryptFromBcd(encryptStr, KeyType.PrivateKey)); + final String encryptStr = rsa.encryptBcd(text, KeyType.PublicKey); + final String decryptStr = StrUtil.utf8Str(rsa.decryptFromBcd(encryptStr, KeyType.PrivateKey)); Assert.assertEquals(text, decryptStr); // 私钥加密,公钥解密 - String encrypt2 = rsa.encryptBcd(text, KeyType.PrivateKey); - String decrypt2 = StrUtil.utf8Str(rsa.decryptFromBcd(encrypt2, KeyType.PublicKey)); + final String encrypt2 = rsa.encryptBcd(text, KeyType.PrivateKey); + final String decrypt2 = StrUtil.utf8Str(rsa.decryptFromBcd(encrypt2, KeyType.PublicKey)); Assert.assertEquals(text, decrypt2); } @Test public void rsaBase64Test() { - String textBase = "我是一段特别长的测试"; - StringBuilder text = new StringBuilder(); + final String textBase = "我是一段特别长的测试"; + final StringBuilder text = new StringBuilder(); for (int i = 0; i < 10; i++) { text.append(textBase); } @@ -165,19 +165,19 @@ public class RSATest { final RSA rsa = new RSA(); // 公钥加密,私钥解密 - String encryptStr = rsa.encryptBase64(text.toString(), KeyType.PublicKey); - String decryptStr = StrUtil.utf8Str(rsa.decrypt(encryptStr, KeyType.PrivateKey)); + final String encryptStr = rsa.encryptBase64(text.toString(), KeyType.PublicKey); + final String decryptStr = StrUtil.utf8Str(rsa.decrypt(encryptStr, KeyType.PrivateKey)); Assert.assertEquals(text.toString(), decryptStr); // 私钥加密,公钥解密 - String encrypt2 = rsa.encryptBase64(text.toString(), KeyType.PrivateKey); - String decrypt2 = StrUtil.utf8Str(rsa.decrypt(encrypt2, KeyType.PublicKey)); + final String encrypt2 = rsa.encryptBase64(text.toString(), KeyType.PrivateKey); + final String decrypt2 = StrUtil.utf8Str(rsa.decrypt(encrypt2, KeyType.PublicKey)); Assert.assertEquals(text.toString(), decrypt2); } @Test public void rsaDecodeTest() { - String PRIVATE_KEY = "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAIL7pbQ+5KKGYRhw7jE31hmA" // + final String PRIVATE_KEY = "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAIL7pbQ+5KKGYRhw7jE31hmA" // + "f8Q60ybd+xZuRmuO5kOFBRqXGxKTQ9TfQI+aMW+0lw/kibKzaD/EKV91107xE384qOy6IcuBfaR5lv39OcoqNZ"// + "5l+Dah5ABGnVkBP9fKOFhPgghBknTRo0/rZFGI6Q1UHXb+4atP++LNFlDymJcPAgMBAAECgYBammGb1alndta" // + "xBmTtLLdveoBmp14p04D8mhkiC33iFKBcLUvvxGg2Vpuc+cbagyu/NZG+R/WDrlgEDUp6861M5BeFN0L9O4hz"// @@ -188,52 +188,52 @@ public class RSATest { + "wfMhrJksfeKbIaMjNLS9b8JynIaXg9iCiyOHmgkMl5gAbPoH/ULXqSKwzBw5mJ2GW1gBlyaSfV3AkA/RJC+adIjsRGg"// + "JOkiRjSmPpGv3FOhl9fsBPjupZBEIuoMWOC8GXK/73DHxwmfNmN7C9+sIi4RBcjEeQ5F5FHZ"; - RSA rsa = new RSA(PRIVATE_KEY, null); + final RSA rsa = new RSA(PRIVATE_KEY, null); - String a = "2707F9FD4288CEF302C972058712F24A5F3EC62C5A14AD2FC59DAB93503AA0FA17113A020EE4EA35EB53F" // + final String a = "2707F9FD4288CEF302C972058712F24A5F3EC62C5A14AD2FC59DAB93503AA0FA17113A020EE4EA35EB53F" // + "75F36564BA1DABAA20F3B90FD39315C30E68FE8A1803B36C29029B23EB612C06ACF3A34BE815074F5EB5AA3A"// + "C0C8832EC42DA725B4E1C38EF4EA1B85904F8B10B2D62EA782B813229F9090E6F7394E42E6F44494BB8"; - byte[] aByte = HexUtil.decodeHex(a); - byte[] decrypt = rsa.decrypt(aByte, KeyType.PrivateKey); + final byte[] aByte = HexUtil.decodeHex(a); + final byte[] decrypt = rsa.decrypt(aByte, KeyType.PrivateKey); Assert.assertEquals("虎头闯杭州,多抬头看天,切勿只管种地", StrUtil.str(decrypt, CharsetUtil.CHARSET_UTF_8)); } @Test public void rsaTest2() throws Exception { - String publicKeyStr = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDgtQn2JZ34ZC28NWYpAUd98iZ37BUrX/aKzmFbt7clFSs6s" + + final String publicKeyStr = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDgtQn2JZ34ZC28NWYpAUd98iZ37BUrX/aKzmFbt7clFSs6s" + "XqHauqKWqdtLkF2KexO40H1YTX8z2lSgBBOAxLsvaklV8k4cBFK9snQXE9/DDaFt6Rr7iVZMldczhC0JNgTz+SHXT6CBHuX3e9S" + "dB1Ua44oncaTWz7OBGLbCiK45wIDAQAB"; - byte[] keyBytes = Base64.decode(publicKeyStr); - PublicKey publicKey = KeyUtil.generateRSAPublicKey(keyBytes); + final byte[] keyBytes = Base64.decode(publicKeyStr); + final PublicKey publicKey = KeyUtil.generateRSAPublicKey(keyBytes); - byte[] data = RandomUtil.randomString("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", 16).getBytes(); + final byte[] data = RandomUtil.randomString("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", 16).getBytes(); //长度不满足128补0 - byte[] finalData = ArrayUtil.resize(data, 128); + final byte[] finalData = ArrayUtil.resize(data, 128); //jdk原生加密 - Cipher cipher = Cipher.getInstance("RSA/ECB/NoPadding"); + final Cipher cipher = Cipher.getInstance("RSA/ECB/NoPadding"); cipher.init(Cipher.ENCRYPT_MODE, publicKey); - String result1 = HexUtil.encodeHexStr(cipher.doFinal(finalData)); + final String result1 = HexUtil.encodeHexStr(cipher.doFinal(finalData)); //hutool加密 - RSA rsa = new RSA("RSA/ECB/NoPadding", null, publicKeyStr); + final RSA rsa = new RSA("RSA/ECB/NoPadding", null, publicKeyStr); rsa.setEncryptBlockSize(128); - String result2 = rsa.encryptHex(finalData, KeyType.PublicKey); + final String result2 = rsa.encryptHex(finalData, KeyType.PublicKey); Assert.assertEquals(result1, result2); } @Test public void exponentTest(){ - String modulus = "BD99BAAB9E56B7FD85FB8BCF53CAD2913C1ACEF9063E7C913CD6FC4FEE040DA44D8" + + final String modulus = "BD99BAAB9E56B7FD85FB8BCF53CAD2913C1ACEF9063E7C913CD6FC4FEE040DA44D8" + "ADAA35A9DCABD6E936C402D47278049638407135BAB22BB091396CB6873195C8AC8B0B7AB123" + "C3BF7A6341A4419BDBC0EFB85DBCD9A3AD12C99E2265BDCC1197913749E2AFA568EB7623DA3A" + "361335AA1F9FFA6E1801DDC8228AA86306B87"; - String publicExponent = "65537"; - RSA rsa = new RSA(new BigInteger(modulus, 16), null, new BigInteger(publicExponent)); + final String publicExponent = "65537"; + final RSA rsa = new RSA(new BigInteger(modulus, 16), null, new BigInteger(publicExponent)); final String encryptBase64 = rsa.encryptBase64("测试内容", KeyType.PublicKey); Assert.assertNotNull(encryptBase64);