当前位置: 首页 > 知识库问答 >
问题:

Java与Javascript兼容的AES算法

南门烈
2023-03-14

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

我在互联网上看到了一些例子,但在兼容性方面似乎有些不同。

多谢了。

共有1个答案

宇文勇
2023-03-14

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

下面是一个测试过的例子。它使用标准的Java加密函数(和Apache Commons编解码器)和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>
 类似资料:
  • 我已经从这个站点编译了一些AES实现代码,它应该执行128位密钥加密。我测试了可以正常工作的加密/解密程序。 然而,如果我用上面提到的代码加密任何东西,然后尝试用linux内置的openssl工具解密,我就是无法解密它,它甚至会记录错误的幻数错误。同样,如果我用openssl加密任何东西,并尝试用代码解密,那么就不会起作用。我试过两个cbc欧洲央行。 如果他们都在实施AES,它不应该以同样的方式工

  • 问题内容: 检索具有特定类的元素数组的最佳方法是什么? 我会使用document.getElementsByClassName,但IE不支持它。 …但是IE仍然说: 对象不支持此属性或方法 有什么想法,更好的方法,错误修复? 我不希望使用任何涉及jQuery或其他“笨拙的javascript”的解决方案。 我知道了! 正如@joe提到的,该函数不是的方法。 因此,工作代码如下所示: …此外, 如果

  • 我正在使用生成cacerts。 然后我使用,但我会遇到这样的例外: 这是兼容性问题吗?使用一个版本的java生成的Cacert是否与另一个版本的java不兼容?

  • 本文向大家介绍javascript中实现兼容JAVA的hashCode算法代码分享,包括了javascript中实现兼容JAVA的hashCode算法代码分享的使用技巧和注意事项,需要的朋友参考一下 在java中一个hashCode算法,可以用来计算一个字符串的hash值,今天一个朋友突然问俺能不能在js中计算hashCode,要求和java的hashCode计算结果一样。 对于java的hash

  • 本文向大家介绍JavaScript的兼容性与调试技巧,包括了JavaScript的兼容性与调试技巧的使用技巧和注意事项,需要的朋友参考一下 关于JavaSctipt的兼容性,最懒的办法就是用jQuery的工具函数。尽量不要用那些什么ECMAScript之类的函数,因为很多浏览器都会报找不到函数的错误。下面列出一些在开发过程中碰到过的javascript问题。 1、参数列表多个逗号。   $.aja

  • 运行以下代码段(在Eclipse中设置了JDK7): 以下异常的结果: java.lang.UnsupportedClassVersionError:org/testfx/framework/junit/applicationtest:不支持major.minor版本52.0在java.lang.ClassLoader.DefineClass1(本机方法)在java.lang.ClassLoade