CryptoJS每次都会解密

时间:2017-08-12 17:13:32

标签: javascript encryption cryptojs

我正在使用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));

Java code

1 个答案:

答案 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>