首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >欧洲央行模式下三重DES与CryptoJS加密及PKCS#5填充

欧洲央行模式下三重DES与CryptoJS加密及PKCS#5填充
EN

Stack Overflow用户
提问于 2019-02-08 02:38:04
回答 1查看 1.3K关注 0票数 0

在发送到第三方API之前,我正在对字符串进行加密,该API需要在欧洲央行模式下使用PKCS#5填充方式进行三重DES加密。他们给了我一个要加密的字符串样本

www.society.com|1084470043000|memberaccess

和一个样本钥匙

92f2f81930b5afb056630afb0f2f2f8b1

得到的加密字符串应该匹配。

uQlYYov+XlVEHL0JBpvt15FeJxt+fXgjs9KLJHH5XsUd80emx5Nn5kSaCXxhQId/

但我收到的字符串是

U2FsdGVkX19/IR4A9cm+duXf3vhnmnuyJtXFVWJi/Ptqib7g5gOANppYXh+mTQ8tcenO58a5FxnFVxRq1PUETA==

我在用这些图书馆

代码语言:javascript
复制
<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>

这是我的密码

代码语言:javascript
复制
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不是。

代码语言: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);
}

更新:

我觉得我离得太近了。通过使用以下方法转换我的密钥

代码语言:javascript
复制
var encryptedKey = CryptoJS.enc.Base64.parse(key);

我能够生成一个加密的值,它与供应商给我的示例只差几个字符。这是我现在的小提琴。

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

更新:

我有两个问题。

  1. 在像这样使用之前,我需要对密钥进行基础64加密。 var encryptedKey =CryptoJS.enc.Base 64.解析(Key);
  2. 供应商的文档是错误的,要加密的值应该是使用.org地址而不是.com地址。GRRR!
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-08 16:38:33

来自CryptoJS文档:

对于密钥,当您传递一个字符串时,它被视为一个密码,并用于派生一个实际的密钥和IV,或者您可以传递一个表示实际密钥的WordArray。如果您传递实际密钥,则还必须传递实际的IV。

您应该对字数组的键进行十六进制解码,并将16字节IV设置为所有零字节。欧洲央行没有使用IV,但请具体说明。否则,键将从字符串中派生,这显然会导致不正确的结果。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54585323

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档