Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

3DES加密 #2

Open
xiaohuoni opened this issue Oct 12, 2019 · 8 comments
Open

3DES加密 #2

xiaohuoni opened this issue Oct 12, 2019 · 8 comments

Comments

@xiaohuoni
Copy link
Member

xiaohuoni commented Oct 12, 2019

crypto-js 官网找不到用例,自己试了试,最后得出以下正确代码。

对密码明文先进行 base64 加密,如密码 22 加之后 MjI=
然后对加密后的密文进行 3DES 加密,密码:123456789012345678901234 ,偏移量: 12345678 ,得到最后密文 1DKCnPsI/FQ=

import CryptoJS from 'crypto-js';

function encode3DES(psw: string): string {
  const edsKey = '123456789012345678901234'; // 密码
  const edsIv = '12345678'; // 偏移量
  const str = CryptoJS.enc.Utf8.parse(psw);
  const baseStr = CryptoJS.enc.Base64.stringify(str);
  const KeyHex = CryptoJS.enc.Utf8.parse(edsKey);
  const baseStrUtf = CryptoJS.enc.Utf8.parse(baseStr);
  const encrypted = CryptoJS.TripleDES.encrypt(baseStrUtf,
    KeyHex,
    {
      mode: CryptoJS.mode.CBC,
      padding: CryptoJS.pad.Pkcs7,
      iv: CryptoJS.enc.Utf8.parse(edsIv)
    });
  return encrypted.toString();
}
@wangxingkang
Copy link
Member

需要这个仓库做什么吗

@xiaohuoni
Copy link
Member Author

我的想法是 能不能像描述需求一样,描述代码。

对密码明文先进行 base64 加密,如密码 22 加之后 MjI=
然后对加密后的密文进行 3DES 加密,密码:123456789012345678901234 ,偏移量: 12345678 ,得到最后密文 1DKCnPsI/FQ=
const str = '22';
const psw = do(str).base64().3DES().offetset('12345678')
log(psw) // 1DKCnPsI/FQ=

@wangxingkang
Copy link
Member

我觉得可以这样 每个功能单独 提供 再封装一下 可以链式调用?

@imhele
Copy link
Member

imhele commented Nov 20, 2019

头一回见先把字符串 base64 编码再用的,如果没有乱码问题而且源数据也不是二进制一般不需要额外编码一次。
主要是编码麻烦,可以给每个加密函数添加一个 from 属性,把类似

CryptoJS.TripleDES.encrypt(CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(psw)), CryptoJS.enc.Utf8.parse(edsKey));

这种的改成

CryptoJS.TripleDES.encrypt.from([psw, 'base64', 'utf8'], [edsKey, null, 'utf8']);
// 输入的内容可以是 ArrayBuffer 或者字符串,字符串默认 utf8 ,等价于
CryptoJS.TripleDES.encrypt.from([psw, 'base64'], edsKey);

内部数据全部采用 ArrayBuffer ,字符串不方便编码来编码去的。

@imhele
Copy link
Member

imhele commented Nov 20, 2019

配置项改造比较简单,类似这种的:

CryptoJS.TripleDES.encrypt(baseStrUtf, KeyHex, {
  mode: CryptoJS.mode.CBC,
  padding: CryptoJS.pad.Pkcs7,
  iv: CryptoJS.enc.Utf8.parse(edsIv)
});

维持一个内部对象,或者用 class 做成这样用:

CryptoJS.TripleDES.encrypt(baseStrUtf, KeyHex).mode('CBC').padding('Pkcs7').iv(edsIv).toString();

@xiaohuoni
Copy link
Member Author

不是头一次见XXXX操作,是前后端同步协定的,加密操作步骤,这个步骤在实际应用中,应该是一个随机状态

@imhele
Copy link
Member

imhele commented Nov 20, 2019

不是头一次见XXXX操作,是前后端同步协定的,加密操作步骤,这个步骤在实际应用中,应该是一个随机状态

嗯嗯,可以有但不方便做到链式调用里面,

@imhele imhele closed this as completed Nov 20, 2019
@imhele

This comment has been minimized.

@imhele imhele reopened this Nov 20, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants