为什么这个密文总是以相同的字符开头
Why does this ciphertext always start with the same characters?
我开始玩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来说是正常的吗?
解码字符串,似乎是
U2FsdGVkX19
解码为
Salted_
FIDDLE
所以它只是CryptoJS添加的一个字符串,作为盐
添加到密文的初始字符串是"Salted__"
(没有引号,末尾有两个下划线),表明接下来的八个字节是salt值,后面是密文。
这可能会与OpenSSL保持二进制兼容性,如果使用密码而不是密钥,OpenSSL也会这样做。然后使用EVP_BytesToKey
函数导出密钥。这是OpenSSL的专有协议,不是添加盐或从密码派生密钥的标准化方法。
相关文章:
- 如果文本或值以字符开头,请运行函数
- 用于删除字符串中字符开头到结尾的正则表达式
- 验证模式中的HTML5不适用于以一些特定字符开头的字符串
- 获取javascript中以a到Z之间的特定字符开头的第一个文本的位置
- 正则表达式保留/匹配任何以特定字符开头的单词
- 密码正则表达式:“至少 1 个字母、1 个数字、1 个特殊字符,并且不应以特殊字符开头”
- JavaScript 正则表达式,用于获取以 @ 字符开头的字符串中的变量列表
- D3 - 如果文本以字符“f”开头,则附加矩形,否则附加圆圈
- 如果文本以这些字符开头或结尾,请删除字符
- 替换以给定字符开头的字符串
- 获取以字符开头的子字符串
- 如何在javascript中用一个特殊字符开头的单词内的空格替换下划线
- 仅当字符串没有't以一些字符开头
- 以字符开头、以数字结尾的字符串的模式匹配
- Regex: 用于不以单词字符开头的字符串
- 如何知道字符串以 javascript 中的特定字符开头/结尾
- Regex匹配所有单词,但以特殊字符开头和结尾的单词除外
- JavaScript删除字符串中以字符开头的行
- 从以某个字符开头的文本中分割单词
- 匹配包含下划线、小写ASCII字母、ASCII数字、连字符或点的字符串,但不能以点和连字符开头