我正在使用CryptoJS手动解密带有一组提供的值的字符串。提供了秘密,然后SHA256被采用。消息和初始化向量是base 64编码的。这是我正在尝试的,但每次我运行它,输出都会改变 - 怎么会这样?!我的智慧结束了......
<%= form_for @product, :html => {:multipart => true} do |f| %>
<div class="field">
<%= f.label :name %><br>
<%= f.text_field :name %>
</div>
<div class="field">
<%= f.label :prize %><br>
<%= f.text_field :prize %>
</div>
<div class="field">
<%= f.label :Select_Category %><br>
<%= f.select :category_id, @categories.map{ |c| [c.name, c.id] } %>
</div>
<div class="field">
<%= f.label :avatar %><br>
<%= f.file_field :avatar %>
</div>
<div class="field">
<%= f.label :description %><br>
<%= f.text_area :description %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
每次运行时最后一行都会更改(在页面加载时运行) - 每次提供相同的值,输出不同。
它应该如何运作:
// Key and take the hash of it
var secretKey = 'TESTING123Secret_Key';
var secretKeyHash = CryptoJS.SHA256(secretKey).toString(CryptoJS.enc.Hex);
// Base 64 encoded values
var accountNumberBase64 = 'nxjYfo4Stw63YBEcnjo3oQ==';
var initializationVectorBase64 = 'HnNcvu9AP9yl09APWkWnDQ==';
// decode the values provided above
var accountNumberEncrypt = atob(accountNumberBase64);
var initializationVector = atob(initializationVectorBase64);
// Use crypto to decrypt
var decrypted = CryptoJS.AES.decrypt(
{
ciphertext: accountNumberEncrypt,
salt: ''
},
secretKeyHash,
{
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.NoPadding,
iv: initializationVector,
salt: ''
}
);
console.log(' decrypted, by hand: ' + decrypted.toString(CryptoJS.enc.Hex));
答案 0 :(得分:3)
您的代码存在许多问题。很难说对非确定性解密真正负责的是什么。我想这是你将密钥作为字符串传递的事实,这意味着CryptoJS将假设它是一个密码并尝试使用EVP_BytesToKey从中派生密钥。由于没有设置salt,CryptoJS可能有一个错误,它生成一个随机盐进行解密(它不应该)。如果要手动提供密钥,则需要将密钥解析为WordArray
。
另一个主要问题是使用非CryptoJS方法进行解码(atob
),这意味着您获得了CryptoJS无法直接读取的某些数据格式。 CryptoJS依赖于内部WordArray
来表示所有二进制数据,或者期望所有字符串都是UTF-8编码的。
工作代码:
// Key and take the hash of it
var secretKey = 'TESTING123Secret_Key';
var secretKeyHash = CryptoJS.SHA256(secretKey).toString(CryptoJS.enc.Hex).slice(0,32);
secretKeyHash = CryptoJS.enc.Utf8.parse(secretKeyHash);
// Base 64 encoded values
var accountNumberBase64 = 'nxjYfo4Stw63YBEcnjo3oQ==';
var initializationVectorBase64 = 'HnNcvu9AP9yl09APWkWnDQ==';
var ct = CryptoJS.enc.Base64.parse(accountNumberBase64);
var iv = CryptoJS.enc.Base64.parse(initializationVectorBase64);
// Use crypto to decrypt
var decrypted = CryptoJS.AES.decrypt({
ciphertext: ct
},
secretKeyHash, {
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.NoPadding,
iv: iv
}
);
console.log(' decrypted, by hand: ' + decrypted.toString(CryptoJS.enc.Utf8));
<script src="https://cdn.rawgit.com/CryptoStore/crypto-js/3.1.2/build/rollups/aes.js"></script>
<script src="https://cdn.rawgit.com/CryptoStore/crypto-js/3.1.2/build/rollups/sha256.js"></script>
<script src="https://cdn.rawgit.com/CryptoStore/crypto-js/3.1.2/build/components/pad-nopadding-min.js"></script>