如何通过RC4密钥字符串还原密钥?SecretKey实例不一致排查
解决RC4密钥重新生成后实例显示不同的问题
嘿,你遇到的这个问题其实是个很容易踩的小坑——SecretKey的toString()方法默认输出的是对象的内存哈希码,不是密钥的实际内容,所以两个实例的字符串看起来不一样,不代表密钥本身有问题。
我来给你拆解一下:
为什么toString输出不同?
Java里的SecretKeySpec继承自Object,默认的toString()会打印对象的内存标识(就是@后面的十六进制数),每个新创建的对象这个值肯定不一样,但这和密钥的实际字节内容完全没关系。如何验证密钥真的一致?
别光看toString,直接对比两个密钥的原始字节数组才靠谱,用这段代码试试:import java.util.Arrays; // ... 你的原有代码 ... SecretKey originalK = rc4Client.getK(); String encodedK = Base64.getEncoder().encodeToString(originalK.getEncoded()); byte[] decodedKey = Base64.getDecoder().decode(encodedK); SecretKey newK = new SecretKeySpec(decodedKey, 0, decodedKey.length, "RC4"); // 对比字节数组 boolean keysMatch = Arrays.equals(originalK.getEncoded(), newK.getEncoded()); System.out.println("密钥实际内容是否一致:" + keysMatch);运行后你会看到输出是
true,说明两个密钥的核心内容完全相同。你的RC4密钥生成逻辑是对的
你用SecretKeySpec包装解码后的字节数组作为RC4密钥的做法完全正确。RC4是流密码,它只需要原始的密钥字节,不需要额外的算法参数(比如AES需要IV),所以这段代码没问题。实际测试加密解密一致性
如果你还是不放心,可以加一段端到端的测试:import java.nio.charset.StandardCharsets; // 用原密钥加密 byte[] plaintext = "Hello RC4 Test".getBytes(StandardCharsets.UTF_8); byte[] ciphertext = rc4Client.encrypt(plaintext); // 用重新生成的密钥解密 RC4 newRc4Instance = new RC4(); newRc4Instance.setK(newK); byte[] decryptedText = newRc4Instance.decrypt(ciphertext); System.out.println("原明文:" + new String(plaintext, StandardCharsets.UTF_8)); System.out.println("解密结果:" + new String(decryptedText, StandardCharsets.UTF_8));运行后你会发现解密结果和原明文完全一致,这就证明重新生成的密钥是有效的。
内容的提问来源于stack exchange,提问作者Astoach167
相关产品推荐
相关产品推荐

