在 Java 中,我生成并序列化对称 key 以用于加密目的:
KeyGenerator keyGen = KeyGenerator.getInstance(algorithm);
SecretKey symmetricKey = keyGen.generateKey();
Base64.encode(symmetricKey.getEncoded(), new FileOutputStream(filename));
其中 Base64 来自 BouncycaSTLe 加密包,算法为 AES。
当与 Oracle (Sun) JVM 1.6.0_21 一起使用时,该 key 可以完美地从 Windows 迁移到 Linux(甚至在 32/64 位操作系统之间)。
在 OS X (Intel) 上,使用 Apple 的 JVM,加载 key 毫无异常(exception),但在 Windows 或 Linux 上加密的每个字符串都会生成 BadPaddingException。
字符串使用以下代码进行编码:
Cipher cipher = Cipher.getInstance(algorithm, "BC");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
encryptedString = new String(Base64.encode(cipher.doFinal(string.getBytes())));
其中算法是 AES。
有什么线索吗?
最佳答案
填充与键无关。
您在创建Cipher
时指定什么填充算法?
如果您实际上仅使用“AES”作为密码算法,则应该明确模式和填充。否则,加密货币提供商可以自由选择自己的一些默认值,并且这可能会因机器而异。
关于Java 密码学生成 key 的可移植性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3917742/