如何用aes表达openssl_encrypt函数

时间:2017-02-05 00:56:37

标签: php encryption aes autoit php-openssl

我想在autoit中使用php openssl_encrypt函数。 我找到了AES and Base64 UDF,所以我应该能够创建一个openssl_encrypt函数。 这是我需要在autoit中复制的函数:

function cripta($data){
    return openssl_encrypt($data,'AES-128-CBC',base64_decode("dGVzdHBhc3N3b3JkLi4uLg=="),0,"0102030405060708");
}

我尝试使用此代码使用autoit:

#Include "AES.au3"
#include "BASE64.au3"

Global $mainKey = "dGVzdHBhc3N3b3JkLi4uLg=="
Global $mainIV = "0102030405060708"


_AES_Startup()
ConsoleWrite(cripta("test") & @CRLF)


Func cripta($Data)
    Global $mainKey, $mainIV
    $Key = _Base64Decode($mainKey)
    Return BinaryToString(_Base64Encode(_AesEncrypt($Key, $Data,  $AES_CBC_MODE, $mainIV)))
EndFunc

还尝试过:

#Include "AES.au3"
#include "BASE64.au3"

Global $mainKey = "dGVzdHBhc3N3b3JkLi4uLg=="
Global $mainIV = "0102030405060708"


_AES_Startup()
ConsoleWrite(cripta("test") & @CRLF)


Func cripta($Data)
    Global $mainKey, $mainIV
    $Key = _AesEncryptKey(_Base64Decode($mainKey))
    Return BinaryToString(_Base64Encode(_AesEncryptCBC($Key, $mainIV, $Data)))
EndFunc

但每次输出都不同(php,first autoit和second autoit)。 我认为openssl只是aes加密的base64编码,但似乎不是。有人可以帮助我,不仅仅是在自动部分,而且还通过解释我如何使用aes和base64函数来实现openssl_encrypt函数。 谢谢。

1 个答案:

答案 0 :(得分:2)

openssl_encrypt不直接编码任何东西,它只返回一个由字节组成的字符串。不要被官方API所迷惑,密钥和IV也需要以字节为单位指定。

因此,您的第一个自动_AesEncryptCbc通常应返回相同的二进制字符串。如果您想比较文本,您可能也希望将openssl_encrypt编码为Base64。

使用大于16字节的明文消息进行测试。如果您使用这么大的字符串并且只有最后一部分不同,那么_AesEncryptCbc可能不会使用PKCS#7兼容填充(OpenSSL的默认值)。