我开始玩弄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是正常的吗?
答案 0 :(得分:2)
答案 1 :(得分:2)
添加到密文的初始String是"Salted__"
(没有引号,末尾有两个下划线),表示接下来的8个字节是salt值,后跟密文
这可能会保持与OpenSSL的二进制兼容性,如果使用密码而不是密钥,则会执行相同的操作。然后使用EVP_BytesToKey
function`导出密钥。这是OpenSSL的专有协议,它不是添加盐或从密码派生密钥的标准化方法。