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

如何用aes-256-ecb加密的as3crypto字符串解密?

严恩
2023-03-14

字符串像这里一样用php加密。可以用这个用参数解密:Rijndael-256,ECB,Base64。但是我的ActionScript代码无法解密它:

var text:String = "Some data";
var key:ByteArray = new ByteArray();
key.writeUTFBytes("SomePassword");
key.position = key.length;
for (var i:int = key.length; i < 256 / 8; i++) {
    key.writeByte(0);
}
var pad:IPad = new NullPad();
var cipher:ICipher = Crypto.getCipher("aes-256-ecb", key, pad);
var data:ByteArray = Base64.decodeToByteArray(text);
cipher.decrypt(data);
trace(data.toString());

更新:

“它无法解密”意味着我弄错了纯文本。

在php中,明文首先由aes-256-ecb加密。然后由Base64编码。在ActionScript中,这些步骤以相反的顺序进行。

UPD2:

编码-解码测试:

var key:ByteArray = new ByteArray();
key.writeUTFBytes("Some password");
key.position = key.length;
for (var i:int = key.length; i < 256 / 8; i++) {
    key.writeByte(0);
}
trace(key.toString());
var data:ByteArray = new ByteArray();//plain text
data.writeUTFBytes("Hello, my dear World! Hello, the Sun! Hello, the Moon! Hello! Hello! Hello!");
var pad:IPad = new NullPad();
var cipher:ICipher = Crypto.getCipher("aes-256-ecb", key, pad);
trace(data.toString());//trace plain text
cipher.encrypt(data);
trace(data.toString());//trace encrypted text
cipher.decrypt(data);
trace(data.toString());//trace decrypted text

cihper.encrypt(data) 停止后的输出是:

Some password
Hello, my dear World! Hello, the Sun! Hello, the Moon! Hello! Hello! Hello!
[Fault] exception, information=Error: Error #2030: End of file found.

更新3:

它适用于PKCS5填充:

var pad:IPad = new PKCS5();
var cipher:ICipher = Crypto.getCipher("aes-256-ecb", key, pad);
pad.setBlockSize(cipher.getBlockSize());

输出为:

Some password
Hello, my dear World! Hello, the Sun! Hello, the Moon! Hello! Hello! Hello!
$ú^{±àÙ[pm|x¿9¡ÃZsI D¾`©4¾þÂõ,J
('èfÑk1ôì&­ªQƆfbÇåòþ§VµÄs   ¦p<iÿ
Hello, my dear World! Hello, the Sun! Hello, the Moon! Hello! Hello! Hello!

UPD4:

对于从php(如图所示)获取的数据,使用PKCS5填充的代码在此处停止运行。使用Null填充不会停止,但解密的数据是错误的。

共有1个答案

壤驷康裕
2023-03-14

引用上一篇文章中的代码:

return trim(
    base64_encode(
        mcrypt_encrypt(
            MCRYPT_RIJNDAEL_256,
            $sSecretKey, $sValue, 
            MCRYPT_MODE_ECB, 
            mcrypt_create_iv(
                mcrypt_get_iv_size(
                    MCRYPT_RIJNDAEL_256, 
                    MCRYPT_MODE_ECB
                ), 
                MCRYPT_RAND)
            )
        )
    );

MCRYPT_RIJNDAEL_256不是AES。MCRYPT_RIJNDAEL_128是。Rijndael具有可变的块大小。AES 是 Rijndael 的一个子集,具有固定的块大小。

MCRYPT_RIJNDAEL_* 后面的数字是指块大小。所以MCRYPT_RIJNDAEL_256是具有 256 位块大小的 Rijndael。MCRYPT_RIJNDAEL_128是Rijndael,大小为128块,又名AES。

另外,如果您要使用MCRYPT_MODE_ECB我会将 mcrypt_create_iv() 调用替换为一堆空字节的空字符串。ECB 作为块模式不使用 IV。

最后,我个人的建议是使用phpseclib,这是一个纯粹的PHP AES实现,因为这与mcrypt的直觉相反。

 类似资料:
  • 问题内容: 我有一个来自CryptoJS的加密AES-256字符串,带有密码短语。我需要用Java对其解密,但无法弄清楚该怎么做。似乎需要IV,密钥和盐来解密,就像在CryptoJS主页中一样,加密的数据已经包含所有这些内容,并且CryptoJS可以某种方式从加密的输入中解析出它们。 有人知道该怎么做吗?我已经看到了很多有关CryptoJS的示例-Java加密/解密,但大多数都使用硬编码的IV /

  • 我有一个加密的AES-256字符串从CryptoJS与密码。我需要Java解密,但不知道怎么做。似乎你需要IV、key和盐来解密,就像在CryptoJS主页一样,加密数据已经包含了所有这些数据,CryptoJS可以以某种方式将它们从加密输入中解析出来。 有人知道怎么做吗?我已经看到了很多关于CryptoJS的例子——Java加密/解密,但大多数都使用硬编码的IV/密钥,或者只是从CryptoJS端

  • 我在这个网站上用AES-256加密一个虚拟字符串: https://www.devglan.com/online-tools/aes-encryption-decryption 具有以下参数: null 当我尝试用OpenSSL从命令行解密它时: 我得到这个错误:

  • 所以我有一个AES-256-ecb base64字符串,我用在线工具解码了它。然而,我更喜欢命令行,所以我尝试使用命令行来解码它。 这是我尝试过的,但我得到了严重的解密错误 是加密的base64文本 -aes-256-ecb是加密密码 而366a74cb3c959de17d61db30591c39d1是关键 结果应该是另一个base64字符串:

  • 我正在尝试解密一个文本,它是用AES-256-ECB用给定的密钥加密的。为了解密,Im使用了用于加密的相同版本的openssl(openssl 1.1.1d,2019年9月10日)。 我试过这些命令: 我得到的是:。有什么问题?

  • 我想在Go中使用AES-256加密一个字符串,无需任何GCM处理,以与MQL4进行比较。当我试图加密特殊字符或数字时,我会遇到问题。我应该以某种方式预处理我的明文吗?我是新来的,所以任何帮助都将不胜感激;我的代码在这个解释下面。 如果我加密明文“这是一个秘密”,然后解密密文(编码为十六进制),我会得到相同的结果(即“这是一个秘密”)。pt是下面代码中明文的变量名。 如果我试图加密“这是一个秘密;1