在ECB模式和PKCS#5填充使用三重DES加密CryptoJS

问题描述 投票:0回答:1

发送到第三方API需要与PKCS#5填充ECB模式的三重DES加密之前我加密字符串。他们给了我一个样品字符串加密的

www.society.com | 1084470043000 | memberaccess

和的样品关键

92f2f81930b5afb056630afb02f2f8b1

生成的加密字符串应该匹配

uQlYYov + XlVEHL0JBpvt15FeJxt + fXgjs9KLJHH5XsUd80emx5Nn5kSaCXxhQId /

但我收到的字符串

U2FsdGVkX19 / IR4A9cm + duXf3vhnmnuyJtXFVWJi / Ptqib7g5gOANppYXh + mTQ8tcenO58a5FxnFVxRq1PUETA ==

我使用这些库

<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9/crypto-js.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9/tripledes.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9/mode-ecb.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9/pad-pkcs7.js"></script>

这是我的代码

var encrypted = CryptoJS.TripleDES.encrypt("www.society.com|1084470043000|memberaccess" , "92f2f81930b5afb056630afb02f2f8b1", {
        mode: CryptoJS.mode.ECB,
        padding: CryptoJS.pad.Pkcs7
    });

我意识到,我指定PKCS#7,而不是PKCS#5,但我还没有找到PKCS#5的库。

我的问题是,它是否能够满足使用CryptoJS他们的要求,如果没有,是否有任何其他的JavaScript解决方案可用?

我的小提琴

https://jsfiddle.net/dwc6zb89/2/

我没有花足够的时间在密码给你它是否是一个base64或不是一个很好的答案。我相信,因为我有我写的C#代码块产生近正确的结果。这是一个几个字符关闭。我继续比较两个,看看我的C#代码是这样做的JavaScript不是。

public static string Encrypt(string toEncrypt, bool useHashing)
{
    var key = "92f2f81930b5afb056630afb02f2f8b1";

    var iso8859_1 = System.Text.Encoding.GetEncoding("iso-8859-1");

    var keyArray = Convert.FromBase64String(iso8859_1.GetString(iso8859_1.GetBytes(key)));


    byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toEncrypt);




    if (useHashing)
    {
        MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();

        //Always release the resources and flush data
        // of the Cryptographic service provide. Best Practice

        hashmd5.Clear();
    }
    else
        keyArray = UTF8Encoding.UTF8.GetBytes(key);

    TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
    //set the secret key for the tripleDES algorithm
    tdes.Key = keyArray;
    //mode of operation. there are other 4 modes.
    //We choose ECB(Electronic code Book)
    tdes.Mode = CipherMode.ECB;
    //padding mode(if any extra byte added)

    tdes.Padding = PaddingMode.PKCS7;

    ICryptoTransform cTransform = tdes.CreateEncryptor();
    //transform the specified region of bytes array to resultArray
    byte[] resultArray =
      cTransform.TransformFinalBlock(toEncryptArray, 0,
      toEncryptArray.Length);
    //Release resources held by TripleDes Encryptor
    tdes.Clear();
    //Return the encrypted data into unreadable string format
    return Convert.ToBase64String(resultArray, 0, resultArray.Length);
}

更新:

我觉得我很令人恼火接近。通过使用转换我的钥匙以下

var encryptedKey = CryptoJS.enc.Base64.parse(key);

我能够生成加密值只有几个字符关闭从供应商给我的样品。这是我目前的小提琴。

https://jsfiddle.net/uv8z2mrc/1/

更新:

我有两个问题。

  1. 我需要使用它像这样前64基础加密我的钥匙。 VAR encryptedKey = CryptoJS.enc.Base64.parse(键);
  2. 各厂商文档是错误的,要加密本来的价值是用的,而不是.org等.COM的地址。哎呀!
javascript encryption cryptography cryptojs
1个回答
0
投票

从CryptoJS文档:

对于关键的,当你传递一个字符串,它会被视为一个密码和用于导出实际密钥和IV。或者你也可以传递表示实际键WordArray。如果您通过实际的关键,还必须通过实际的IV。

你应该六角解码的关键字阵列,也给一个16字节的IV设置为全零个字节。 IV是不使用的ECB,但请注明它没有-的少。否则,将重点从字符串,这显然会导致不正确的结果导出。

© www.soinside.com 2019 - 2024. All rights reserved.