为什么这个密文总是以相同的字符开头?

时间:2014-04-21 20:11:35

标签: javascript angularjs cryptography cryptojs

我开始玩弄CryptoJS,我注意到一些奇怪的事情:密文总是以相同的字符串开头。这是执行加密的代码(我知道Math.random不是加密安全的,这只是快速而又脏的东西)。

function Controller($scope) {
    $scope.Text = "";
    $scope.CipherText = "";
    $scope.Key = Math.random().toString();

    $scope.Encrypt = function ($event) {
        $scope.CipherText = CryptoJS.AES.encrypt($scope.Text, $scope.Key).toString();
    }
}

使用HTML:

<div ng-controller="Controller">
    <div>Your key is: "{{Key}}".</div>
    <div>
        <textarea ng-change="Encrypt()" ng-model="Text" maxlength="140">{{Text}}</textarea>
        <br />
        <span>{{Text.length}} of 140</span>
    </div>
    <div>
        <textarea ng-model="CipherText" maxlength="216">{{CipherText}}</textarea>
        <br />
        <span>{{CipherText.length}} of 216</span>
    </div>
</div>

经过几次运行后,我注意到base64密文始终以相同的几个字符开头。对于密钥0.5640227501280606

a: U2FsdGVkX19kMKXVbnJHKbEkrwctAm2YbOTnPmtGRCg=
b: U2FsdGVkX18+0sG2DQzVgHwxH2cvrSqaDIxOOkUt5YU=
c: U2FsdGVkX19xGQdT6OUhbyyg1zfgqpGnWvF5Ibqkuqc=

我用不同的键和不同长度的明文尝试过这个。密文始终以U2FsdGVkX1开头。这里发生了什么? CryptoJS是否存储了一些内部信息?或者在某些情况下AES是正常的吗?

2 个答案:

答案 0 :(得分:2)

解码字符串,似乎

U2FsdGVkX19

解码为

Salted_

FIDDLE

所以它只是一个由CryptoJS添加为盐的字符串

答案 1 :(得分:2)

添加到密文的初始String是"Salted__"(没有引号,末尾有两个下划线),表示接下来的8个字节是salt值,后跟密文

这可能会保持与OpenSSL的二进制兼容性,如果使用密码而不是密钥,则会执行相同的操作。然后使用EVP_BytesToKey function`导出密钥。这是OpenSSL的专有协议,它不是添加盐或从密码派生密钥的标准化方法。