【问题标题】:Why is AES encrypted cipher of the same string with the same key always different?为什么具有相同密钥的相同字符串的AES加密密码总是不同?
【发布时间】:2012-08-02 20:34:56
【问题描述】:

我有一个名为 plain.txt 的文件。在我拥有的文件中:

Hello Hello Hello Hello

我正在使用这个命令来加密它:

openssl enc -aes-128-cbc -salt -k "Hello" -in plain.txt -out encrypted.bin

然后我像这样打印加密值:

buff = open("encrypted.bin")
cipher = buff.read()
buff.close()
print b64encode(cipher)

但它总是不同的价值。密码不应该总是相同的吗?我使用相同的文件和相同的密码来加密它。这些是我的终端输出:

Richard-Knops-MacBook-Pro:python_test richardknop$ openssl enc -aes-128-cbc -salt -k "Hello" -in plain.txt -out encrypted.bin
Richard-Knops-MacBook-Pro:python_test richardknop$ python test.py U2FsdGVkX1+AmoQiIkYAxIYanLr/kbjMfEJPPLfeE/wtyxScvAKzb7K38ZxoI097
Richard-Knops-MacBook-Pro:python_test richardknop$ openssl enc -aes-128-cbc -salt -k "Hello" -in plain.txt -out encrypted.bin
Richard-Knops-MacBook-Pro:python_test richardknop$ python test.py U2FsdGVkX19vPD+OoiK7iSgYJiPMxuKGNWWrLlfBS0c3yCJkuv7QIBGEo2Q86UsV
Richard-Knops-MacBook-Pro:python_test richardknop$ openssl enc -aes-128-cbc -salt -k "Hello" -in plain.txt -out encrypted.bin
Richard-Knops-MacBook-Pro:python_test richardknop$ python test.py U2FsdGVkX1+3I8EC7u3lrcVPyD/JV12NAecWvTPXGga0Nh2cwqLAtGCDhLK6MI9g
Richard-Knops-MacBook-Pro:python_test richardknop$ 

【问题讨论】:

  • 基本上,密文应该总是看起来像随机输出。如果没有,它会泄露信息。在这种情况下,您可以查看具有相同密码的加密是否以先前加密的相同值开始。想象一下下面的对话:你是一般的 BadEncryption 吗?加密答案:“是”。我们应该在黎明时进攻吗?加密答案:“是”。所以敌人看到了加密但相同的信息并开始操作榴弹炮。

标签: python encryption openssl aes


【解决方案1】:

因为“盐”每次都不同。例如,这可以防止对加密值的彩虹表类型攻击。见http://en.wikipedia.org/wiki/Salt_(cryptography)

【讨论】:

  • 可以不使用盐加密吗?参数是什么?
  • 您可以使用-nosalt。但不推荐。
【解决方案2】:

您得到不同加密字符串的原因是“enc -aes-128-cbc”。 CBC 代表密码块链接。所以,对于第二个块,第一个块的加密输出是 ac IV,所以每次你得到不同的字符串。 更多细节谷歌“CBC模式下的AES”

【讨论】:

    【解决方案3】:

    每次运行都会得到不同的输出,因为每次运行命令时都会生成新的 salt。为了为每次连续运行提供相同的盐,请使用 -S salt 选项,即

    openssl enc -aes-128-cbc -salt -S "Salt" -k "Hello" -in plain.txt -out encrypted.bin
    

    【讨论】:

      【解决方案4】:

      原因是用于加密的实际key 是由您的passphraseSALT 驱动的。那么即使您仍然使用相同的密码,密文肯定会有所不同,因为SALT是不同的。

      Openssl 默认使用 salt 来缓解字典攻击。如果您不想使用它,请使用其他答案建议的相同盐,或添加nosalt 选项,如下所示:

      openssl enc -aes-128-cbc -nosalt -k "Hello" -in plain.txt -out encrypted.bin
      

      您可以使用xxd查看十六进制密文

      xxd encrypted.bin
      

      【讨论】:

        猜你喜欢
        • 2018-11-28
        • 1970-01-01
        • 1970-01-01
        • 2012-09-10
        • 1970-01-01
        • 1970-01-01
        • 2010-09-12
        • 2023-04-01
        • 2011-04-07
        相关资源
        最近更新 更多