【问题标题】:Compatible AES algorithm for Java and Javascript兼容 Java 和 Javascript 的 AES 算法
【发布时间】:2014-06-12 19:35:58
【问题描述】:

我需要使用 AES 算法加密 Java 应用程序中的一些值,并在我的应用程序的 Javascript 模块中解密。

我在互联网上看到了一些示例,但似乎在兼容性方面存在一些差异。

像下面的问题:

AES encryption in javascript and decrypting in java

谁能给我一些代码示例来解决这个问题。

谢谢。

【问题讨论】:

标签: java javascript android


【解决方案1】:

AES 是一种精确指定的算法,因此所有 AES 实现必须是“兼容的”。话虽如此,AES 是一种可变密钥长度的块密码,在 128 位块上运行。要在软件中实际使用它,您必须做出许多其他选择:如何处理包含超过 1 个块的输入(这称为“模式”),在某些模式下,您需要一个初始化向量,您需要处理不包含确切数量的块(填充)的输入,如何将字符编码为字节,以及如何在不支持的上下文(如源文件)中表示字节。所有这些东西都需要兼容。

以下是一个经过测试的示例。它使用标准的 Java 加密函数(和 Apache Commons Codec)和 JavaScript 加密库 crypto-js。选择如下:128 位密钥、密码块链接模式(需要初始化向量)、PKCS5/7 填充、UTF-8 用于字符编码、Base64 表示字节数组。

这段Java会输出Base64编码的密文:

String plainText = "Hello, World! This is a Java/Javascript AES test.";
SecretKey key = new SecretKeySpec(
    Base64.decodeBase64("u/Gu5posvwDsXUnV5Zaq4g=="), "AES");
AlgorithmParameterSpec iv = new IvParameterSpec(
    Base64.decodeBase64("5D9r9ZVzEYYgha93/aUK2w==")); 
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key, iv);
System.out.println(Base64.encodeBase64String(cipher.doFinal(
    plainText.getBytes("UTF-8"))));

这段 JavaScript 正确解密了它:

<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/aes.js"></script>
<script>
var encrypted = CryptoJS.enc.Base64.parse('3Q7r1iqtaRuJCo6QHA9/GhkTmbl4VkitV9ZsD3K2VB7LuBNg4enkJUA1cF8cHyovUH2N/jFz3kbq0QsHfPByCg==');
var key = CryptoJS.enc.Base64.parse('u/Gu5posvwDsXUnV5Zaq4g==');
var iv = CryptoJS.enc.Base64.parse('5D9r9ZVzEYYgha93/aUK2w==');
document.write(CryptoJS.enc.Utf8.stringify(CryptoJS.AES.decrypt(
    { ciphertext: encrypted },
    key, 
    { mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7, iv: iv,  })));
</script>

【讨论】:

  • 嗨,Frans 谢谢你的回复,你能告诉我如何使用我自己的密钥而不是“u/Gu5posvwDsXUnV5Zaq4g==".
  • 这家伙已经很完美了github.com/mpetersen/aes-example,我刚刚实现了这个并且要使用字符串密码,你需要匹配 Salt、IV、迭代和密钥大小。
  • 这不再起作用了。我必须通过将{ ciphertext: encrypted } 替换为{ciphertext: encrypted, iv: iv, salt:''} 来添加ivsalt
猜你喜欢
  • 2021-08-10
  • 2011-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-15
  • 2012-02-04
  • 1970-01-01
相关资源
最近更新 更多