Java 密码学生成 key 的可移植性

标签 java macos cryptography portability

在 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/

相关文章:

java - Java Swing 源代码中的何处是菜单上 Enter 按键的实现?

java - 尝试测试队列持久性。消费者断点时无法发送消息

macos - 在 OSX Lion 上安装 NPM

ios - 在 MAC OS X 终端中获取错误消息

java - (1)转换ECDSA私钥和公钥,(2)ECDSA验证

android - google map api中SHA1指纹的用法是什么

java - 如何在 Java 中创建 PKI

java - 等待对象创建或如果它已经存在则立即访问它

Java - TextFlow如何添加字符串列表?一个接着一个?

ruby-on-rails - 这些 Ruby 版本中存在 heroku 命令吗?