Python代码:

     from Crypto.Random import get_random_bytes
     from Crypto.Cipher import AES
     from Crypto.Util.Padding import pad
     import base64

     def encrypt_string(input_string, key_base64, str_iv):
         try:
            key = key_base64.encode('utf-8')
        
            if str_iv:
               iv = base64.b64decode(str_iv)
            else:
               iv = get_random_bytes(16)

            cipher = AES.new(key, AES.MODE_CBC, iv)
            padded_data = pad(input_string.encode(), AES.block_size)
            cipher_data = cipher.encrypt(padded_data)
            combined_data = iv + cipher_data
            return base64.b64encode(combined_data).decode()

         except Exception as e:
            print(e)

    if __name__ == "__main__":
        key = "1bd393e7a457f9023d9ba95fffb5a2e1"
        iv = "1oTOhV9xGyu1mppmWZWa5w=="
        input_string = "AAAAAAA"
        encrypted_data = encrypt_string(input_string, key, iv)
        print("Encrypted string:", encrypted_data)`

输出: 加密字符串:1oTOhV9xGyu1mppmWZWa5 + kzveiTRzRH + gRVHx +7Ad0 =

PHP代码:

      <?php
       function encrypt_string($input_string, $key_base64, $str_iv) {
        try {
         $key = base64_decode($key_base64);

        if ($str_iv) {
            $iv = base64_decode($str_iv);
        } else {
            $iv = openssl_random_pseudo_bytes(16);
        }
        $ciphertext = openssl_encrypt($input_string, 'aes-256-cbc', $key, OPENSSL_RAW_DATA, $iv);
        $combined_data = $iv . $ciphertext;
        return base64_encode($combined_data);
       } catch (Exception $e) {
        echo $e->getMessage();
       }
      }
      $key = "1bd393e7a457f9023d9ba95fffb5a2e1";
       $iv = "1oTOhV9xGyu1mppmWZWa5w==";
       $input_string = "AAAAAAA";
       $encrypted_data = encrypt_string($input_string, $key, $iv);
       echo "Encrypted string: " . $encrypted_data . "\n";
      ?>

输出: 加密字符串:1oTOhV9xGyu1mppmWZWa53Nc8rxWTultBWLvWitUICQ =

请问,有谁知道如何使这两个代码的输出相同?

推荐答案

如果你想得到同样的结果,那么只需删除$key = base64_decode($key_base64).我得到了正确的结果$key = $key_base64.


注意,直接使用base64编码作为密钥意味着输入的每个字符/字节最多包含6位随机信息.因此,如果你插入32个字符,那么密钥大小实际上是32 * 6 = 192位.这已经足够了,但显然比AES—256"promise "的256位要少.

另一个问题是CBC不提供完整性/真实性.


我建议不要把键转换成字符串放在首位—只要保持它们二进制.此外,如果你要使用对称密钥加密,那么使用像NaCL或其他库,执行更高级别的"密封"而不仅仅是加密.如果你想使用密码,那么你应该使用一个好的基于密码的密钥派生函数(PBKDF),如PBKDF 2或Argon2.

Python相关问答推荐

Pandas 填充条件是另一列

将整组数组拆分为最小值与最大值之和的子数组

rame中不兼容的d类型

ModuleNotFound错误:没有名为flags.State的模块; flags不是包

Excel图表-使用openpyxl更改水平轴与Y轴相交的位置(Python)

pandas滚动和窗口中有效观察的最大数量

Python库:可选地支持numpy类型,而不依赖于numpy

如何在Python脚本中附加一个Google tab(已经打开)

Pandas—合并数据帧,在公共列上保留非空值,在另一列上保留平均值

如果值发生变化,则列上的极性累积和

梯度下降:简化要素集的运行时间比原始要素集长

计算每个IP的平均值

如何并行化/加速并行numba代码?

为什么np. exp(1000)给出溢出警告,而np. exp(—100000)没有给出下溢警告?

Flask Jinja2如果语句总是计算为false&

巨 Python :逆向猜谜游戏

Pandas—堆栈多索引头,但不包括第一列

极点用特定值替换前n行

在聚合中使用python-polars时如何计算模式

两个名称相同但值不同的 Select 都会产生相同的值(discord.py)