精华内容
下载资源
问答
  • javascript sha512算法 加密

    千次阅读 2018-02-02 18:54:36
    github下载及使用地址:点击打开链接  检测是否加密正确,可以用在线转码器点击打开链接对比结果。 在要用的js文件中引入sha512库就ok了:更多的用法可以查询github地址 sha512('Message to hash');  ...

    github下载及使用地址:点击打开链接  

    检测是否加密正确,可以用在线转码器点击打开链接对比结果

    在要用的js文件中引入sha512库就ok了:更多的用法可以查询github地址

    sha512('Message to hash');

     

    展开全文
  • jquery 实现MD5加密,MD5加密是一种不可逆的加密算法,可加密成16位小写,16位大写,32位小写,32位大写。
  • md5 JS加密算法

    2015-07-14 17:40:16
    MD5加密算法 js 详细实现: http://blog.csdn.net/gooooooal/article/details/46881297
  • 于是,加密测试,然后与我常用的3DES 算法加密工具比对,发现,算出来结果,一点都对不上,这个其实对于一般使用做网页的人,应该可以使用了,但是我一般都是跟硬件打交道的,使用字符串加密并不适合我。...

    一、前言:

    1. 最近又被领导叫去谈话,公司最近有个二维码模块项目要开发,要求使用微信小程序,说是方面和快捷,不用安装手机APP。o(╥﹏╥)o真是无语,老子在公司的职位是Windwos 开发,现在他们竟然为了省钱,叫我去做微信小程序,碍于今年疫情严重,没有办法,只能重新拾起微信小程序。

    2. 因公司做的产品为门禁读卡设备,所以一般数据安全性有要求,并且与13.56MhHZ ISO14443A CPU卡通讯需要用到3DES 对称加密算法。

     

    二、相关概念

    1. 3DES算法:3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称。它相当于是对每个数据块应用三次DES加密算法 。数据加密标准(DES)是美国的一种由来已久的加密标准,它使用对称密钥加密法

    设Ek()和Dk()代表DES算法的加密和解密过程,K代表DES算法使用的密钥,M代表明文,C代表密文,这样:

    3DES加密过程为:C=Ek3(Dk2(Ek1(M)))

    3DES解密过程为:M=Dk1(EK2(Dk3(C)))

    2. 对称加密和非对称加密:

    对称加密:对称加密采用了对称密码编码技术,它的特点是文件加密和解密使用相同的密钥加密。

    非对称加密:对称加密算法不同,非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)

    所以,3DES 属于对称加密算法。

    3. 3DES 算法中,加密模式有多种,常用分别ECB CBC ,其中

    设Ek()和Dk()分别代表DES算法的加密和解密过程,k代表DES算法使用的密钥,M代表明文,C代表密文,

    则3DES算法的过程可表示为:

    加密:C=Ek3(Dk2(Ek1(M))) 即对明文数据进行,加密 --> 解密 --> 加密的过程,最后得到密文数据。

    解密:M=Dk1(Ek2(Dk3(C))) 即对密文数据进行,解密 --> 加密 --> 解密的过程,最后得到明文数据。

    这里可以K1=K3,但不能K1=K2=K3(如果相等的话就成了DES算法了)

    3DES(K1=K3),可以是3DES-CBC,也可以是3DES-ECB ,此时,密钥可以为16个字节,第三部分的8个字节,使用前8个字节补充。

    3DES-CBC整个算法的流程和DES-CBC一样,但是在原来的加密或者解密处增加了异或运算的步骤,使用的**密钥是16字节长度的密钥**,将密钥分成左8字节和右8字节的两部分,即k1=左8字节,k2=右8字节,然后进行加密运算和解密运算。

    3DES(K1≠K2≠K3),和3DES-CBC的流程完全一样,只是使用的密钥是24字节的,但在每个加密解密加密时候用的密钥不一样,将密钥分为3段8字节的密钥分别为密钥1、密钥2、密钥3,在3DES加密时对加密解密加密依次使用密钥1、密钥2、密钥3,在3DES解密时对解密加密解密依次使用密钥3、密钥2、密钥1。

    由于DES加解密算法是每8个字节作为一个加解密数据块,因此在实现该算法时,需要对数据进行分块和补位(即最后不足8字节时,要补足8字节)

    ECB模式:将待处理的数据分成若干块,每块的长度都为8字节。然后对每块进行加密或解密,最后将他们连接在一起便是最终的结果。每一块的数据互不干扰。

    CBC模式:也需要将待处理的数据分块,但是每一块数据在加密或者解密之前都要与前一块的结果做一次异或操作,因此该模式需要定义一个特殊的8字节Key,用于和第一块数据做异或操作。

    这个特殊的Key就是通常说的初始化向量。在代码中书写时需要配置iv参数,注意IV参数是对应CBC模式的。

    这样一来,每一块数据都是有联系的,这是与ECB模式不同的一点。

    (转)《3DES加密原理》

     

    三、JS 平台3DES算法

    1. 由于在平时工作中,使用的语言是C/C++  和 Java  所以,对于这两个平台使用的3DES早已用烂,所以没有什么关注,但是

    这次项目要求是微信小程序,而小程序使用的JS,所以有必要学会怎么使用,因此写下这篇文章记录,在微信小程序上如何使用3DES.

    2. 对于我项目使用的3DES,可以确定是ECB模式的,而且对于24个字节长度密钥,其中,K1 = K3  ,即,第0 - 7 字节密钥和

    17 - 23 字节密钥相等。对于,cpu卡片使用的3DES 算法也是如此,K1 = K3,  。

    3. Java Script 版本的3DES 算法加密库:

    在网上查找,发现有很多开源的JS版本的3DES 算法加密库,其中,比较好用的谷歌的开源算法库,Google的Cryptojs库,gitbub 地址:  https://github.com/sytelus/CryptoJS

     

    打开可以发现存在众多的常用的加密算法,并且这个都是的源码,可以选择一种加密算法的源代码的文件参与,非常适合对解密文件大小有限制的项目,例如微信小程序这个对源代码有限制的工程项目。

    4. Cryptojs 库3DES 算法库的使用

    4.1  下载源代码,解压,找到rollups中的tripledes.js 文件和components 目录下 mode-ecb.js文件

     

     

     

    4.2 将两个文件放到微信小程序同一目录下,

    在微信小程序使用其他类库文件,需要将对象 以module.export的形式,或其他小程序支持的形式输出,才能正常使用.

    因此, 在tripledes.js 文件底部将CryptoJS对象声明出去供外部其他对象使用,加上下面代码:

    module.exports = {
        CryptoJS: CryptoJS
    };
    

    对于,加密模式文件,mode-ecb.js文件,由于里面CryptoJS.mode.ECB 类使用到了,CryptoJS对象,因此需要在文件头部引入CryptoJS对象,然后将CryptoJS.mode.ECB export .

    module.exports = {
        CryptoJS_mode_ECB:CryptoJS.mode.ECB
    }
    

     

    接着编写,tripledestils.js 工具类, 选用 3DES对称加密加密方式为ECB,java  和 android 填充为Pkcs7,对应js填充为Pkcs5. 对于网上的资料,大部分都是使用与前端用的,所以,大部分的对于算法的使用都是UTF-8 的字符集的,

    使用的加密和解密都是下面的方法和字符集,而我常用的是16进制字符串加密的。

    //3DES字符串加密
    export const getEncodeStrData = (str,key) => {
        var keyHex = CryptoJS.enc.Utf8.parse(key);
        var encrypted = CryptoJS.TripleDES.encrypt(str, keyHex, {
          mode: CryptoJS_mode_ECB,
          padding: CryptoJS.pad.Pkcs7  //后端pkcs5填充,前端对应pkcs7
        });
        return encrypted.toString()
    };
     
    //3DES字符串解密
    export const getDecodeStrData = (str,key) => {
        var keyHex = CryptoJS.enc.Utf8.parse(key);
        var decrypted = CryptoJS.TripleDES.decrypt(str, keyHex, {
          mode:CryptoJS_mode_ECB,
          padding: CryptoJS.pad.Pkcs7 //后端pkcs5填充,前端对应pkcs7
        });
        return decrypted.toString(CryptoJS.enc.Utf8)
    };
     

    于是,加密测试,然后与我常用的3DES 算法加密工具比对,发现,算出来结果,一点都对不上,这个其实对于一般使用做网页的人,应该可以使用了,但是我一般都是跟硬件打交道的,使用字符串加密并不适合我。

    仔细观察,发现输出的结果是是MD5字符串,于是,我查一下资料,发现加密返回的结果可以16进制字符串返回。修改,

    再次比对加密的结果,想哭的心都有。

    //3DES hex 16进制字符串加密
    const encodeString = (data, key) =>
    {
      return encrypted.toString();*/
      var keyHex = CryptoJS.enc.Hex.parse(key);
      var dataHex = CryptoJS.enc.Hex.parse(key);
      var encrypted = CryptoJS.TripleDES.encrypt(dataHex, keyHex, {
        mode: CryptoJS_mode_ECB,
        padding: CryptoJS.pad.Pkcs7  //后端pkcs5填充,前端对应pkcs7
      });
      //return encrypted.toString()
      return encrypted.ciphertext.toString();
    
    };
    
    //3DES hex 16进制字符串解密
    const decodeString = (data, key) => {
    
      var keyHex = CryptoJS.enc.Hex.parse(key);
      var dataHex = CryptoJS.enc.Hex.parse(data);
        var decrypted = CryptoJS.TripleDES.decrypt(dataHex, keyHex, {
          mode:CryptoJS_mode_ECB,
          padding: CryptoJS.pad.Pkcs7 //后端pkcs5填充,前端对应pkcs7
        });
        return decrypted.toString(CryptoJS.enc.Utf8)
    
    };

    修改Ut8 为 Hex ,key 和 data 都进行解析,再次比对加密结果不对,发现解密的结果为空,

    真的无语,无论怎么尝试,结果都是如此,无奈查看tripledes.js 算法的源代码,发现一个问题, 这里使用的.Base64

    调整为Hex ,并且由于使用的对比工具使用的是3DES 模式为 K1 = K3 , 所以,修改代码如下:

    
    //var CryptoJS = require("./tripledes.js").CryptoJs;
    //var CryptoJS_mode_ECB = require("./mode-ecb.js").CryptoJS_mode_ECB;
    
    import {CryptoJS} from './../des/tripledes'  
    import {CryptoJS_mode_ECB} from './../des/mode-ecb.js'
    
    //3DES hex 16进制字符串加密
    const encodeString = (data, key) =>
    {
       //key不足24位自动以0(最小位数是0)补齐,如果多余24位,则截取前24位,后面多余则舍弃掉
      if(key.length != 32 && key.length != 48)
        return null;
    
      if(key.length == 32)
      {
        key = key + key.substr(0, 16);
      }
    
      let keyHex = CryptoJS.enc.Hex.parse(key);
      let dataHex = CryptoJS.enc.Hex.parse(data);
    
      let encrypted = CryptoJS.TripleDES.encrypt(dataHex, keyHex, {
        mode: CryptoJS_mode_ECB,
        padding: CryptoJS.pad.Pkcs7  //java 和 android pkcs5填充,js对应pkcs7
      });
    
      return encrypted.toString().toUpperCase();
    };
    
    //3DES hex 16进制字符串解密
    const decodeString = (data, key) => { 
      if(key.length != 32 && key.length != 48)
      return null;
    
      if(key.length == 32)
      {
        key = key + key.substr(0, 16);
      }
    
      let keyHex = CryptoJS.enc.Hex.parse(key);
    
      let decrypted = CryptoJS.TripleDES.decrypt(data, keyHex, {
        mode:CryptoJS_mode_ECB,
        padding: CryptoJS.pad.Pkcs7 //java 和 android pkcs5填充,js对应pkcs7
      });
    
      return decrypted.toString();
    };
    
    module.exports = {
      encodeString:encodeString,
      decodeString:decodeString
    }

    对比工具,发现,加解密结果一样,哈哈,此时非常开心。

    此时,发现还是有一个问题,有CryptoJs 算出的结果 总是16个字节,经过多次,比对发现,无论怎么修改明文数据,加密结果后面的8个字节总是固定的,解密这个8个字节,发现算法是在明文8个字节后面增加8字节的0808080808080808查看一些资料,发现这个做是为了加快算法的效率。

    因此,为了方便我的使用,并且和Android JAVA C/C++ 一样方便使用,最终,代码如下:

    
    //var CryptoJS = require("./tripledes.js").CryptoJs;
    //var CryptoJS_mode_ECB = require("./mode-ecb.js").CryptoJS_mode_ECB;
    
    import { CryptoJS } from './../des/tripledes'
    import { CryptoJS_mode_ECB } from './../des/mode-ecb.js'
    
    //3DES hex 16进制字符串加密
    const encodeHexString = (data, key) => {
      let keyHex = CryptoJS.enc.Hex.parse(key);
      let dataHex = CryptoJS.enc.Hex.parse(data);
    
      let encrypted = CryptoJS.TripleDES.encrypt(dataHex, keyHex, {
        mode: CryptoJS_mode_ECB,
        padding: CryptoJS.pad.Pkcs7  //java 和 android pkcs5填充,js对应pkcs7
      });
    
      return encrypted.toString().toUpperCase();
    };
    
    //3DES hex 16进制字符串解密
    const decodeHexString = (data, key) => {
      let keyHex = CryptoJS.enc.Hex.parse(key);
    
      let decrypted = CryptoJS.TripleDES.decrypt(data, keyHex, {
        mode: CryptoJS_mode_ECB,
        padding: CryptoJS.pad.Pkcs7 //java 和 android pkcs5填充,js对应pkcs7
      });
    
      return decrypted.toString();
    };
    
    const encodeHex = (data, key) =>
    {
      //key 不是16个字节,或者 24 字节返回空,
      if (key.length != 32 && key.length != 48)
        return null;
    
      if (key.length == 32) {
        //16字节密钥,则K1 = K3, 使用前8字节填充
        key = key + key.substr(0, 16);
      }
    
      let encData = encodeHexString(data, key);
      return encData.substr(0, 16);
    };
    
    const decodeHex = (data, key) =>
    {
      //key 不是16个字节,或者 24 字节返回空,
      if (key.length != 32 && key.length != 48)
        return null;
    
      if (key.length == 32) {
        //16字节密钥,则K1 = K3, 使用前8字节填充
        key = key + key.substr(0, 16);
      }
    
      //由于加密结果的后面8字节固定使用0808080808080808的密文 ,9F4AB5416A6D9DE5 填充,因此固定在需要解密的密文,后面增加9F4AB5416A6D9DE5
      if (data.length == 16) {
        data = data + "9F4AB5416A6D9DE5";
      }
    
      return decodeHexString(data, key);
    };
    
    module.exports = {
      encodeHex: encodeHex,
      decodeHex: decodeHex
    }

    对比加密结果,O(∩_∩)O哈哈~, 开心,有点小成就感。。。。。。。。。。。。

    /**
     *         ┏┓   ┏┓+ +
     *        ┏┛┻━━━┛┻┓ + +
     *        ┃       ┃
     *        ┃   ━   ┃ ++ + + +
     *        ████━████ ┃+
     *        ┃       ┃ +
     *        ┃   ┻   ┃
     *        ┃       ┃ + +
     *        ┗━┓   ┏━┛
     *          ┃   ┃
     *          ┃   ┃ + + + +
     *          ┃   ┃    Code is far away from bug with the animal protecting
     *          ┃   ┃ +     神兽保佑,代码无bug
     *          ┃   ┃
     *          ┃   ┃  +
     *          ┃    ┗━━━┓ + +
     *          ┃        ┣┓
     *          ┃        ┏┛
     *          ┗┓┓┏━┳┓┏┛ + + + +
     *           ┃┫┫ ┃┫┫
     *           ┗┻┛ ┗┻┛+ + + +
     *
     * @author chenxi
     * @date 2020年4月25日21:13:18
     */
     
    ————————————————
    版权声明:本文为CSDN博主「gd6321374」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/gd6321374/article/details/102687903

     

     

     

     

    参考文章:

    3DES加密原理

    微信小程序3DES加解密,ECB模式

    展开全文
  • js-crypt-demos 不再开发:请检查新的存储... 这是一个带有几个定制JavaScript的存储库,这些JavaScript可以使用各种(弱)算法进行加密和解密。 警告:我不是专业密码学家。 不要使用这些工具来保护重要的机密通信。
  • javascript加密算法

    2009-10-15 15:46:00
    本文一共介绍了七种javascript加密方法: 在做网页时(其实是网页木马呵呵),最让人烦恼的是自己辛辛苦苦写出来的客户端IE运行的javascript代码常常被别人轻易的拷贝,实在让自己的心里有点不是滋味,要知道自己写...

      是不是很简单?不要高兴,解密也就同样的简单,解密代码都摆给别人啦(unescape())!呵呵

      二:转义字符""的妙用

      大家可能对转义字符""不太熟悉,但对于javascript提供了一些特殊字符如:n (换行)、 r (回车)、' (单引号 )等应该是有所了解的吧?其实""后面还可以跟八进制或十六进制的数字,如字符"a"则可以表示为:"141"或"x61"(注意是小写字符"x"),至于双字节字符如汉字"黑"则仅能用十六进制表示为"u9ED1"(注意是小写字符"u"),其中字符"u"表示是双字节字符,根据这个原理例子代码则可以表示为:

      八进制转义字符串如下:

    <SCRIPT LANGUAGE="javascript">
    eval("1411541451621645042u9ED1u5BA2u9632u7EBF425173")
    </SCRIPT>

      十六进制转义字符串如下:

    <SCRIPT LANGUAGE="javascript">
    eval("x61x6Cx65x72x74x28x22u9ED1u5BA2u9632u7EBFx22x29x3B")
    </SCRIPT>

      这次没有了解码函数,因为javascript执行时会自行转换,同样解码也是很简单如下:

    <SCRIPT LANGUAGE="javascript">
    alert("x61x6Cx65x72x74x28x22u9ED1u5BA2u9632u7EBFx22x29x3B")
    </SCRIPT>

      就会弹出对话框告诉你解密后的结果!

      三:使用Microsoft出品的脚本编码器Script Encoder来进行编码

      工具的使用就不多介绍啦!我是直接使用javascript调用控件Scripting.Encoder完成的编码!代码如下:

    <SCRIPT LANGUAGE="javascript">
    var Senc=new ActiveXObject("Scripting.Encoder");
    var code='<SCRIPT LANGUAGE="javascript">rnalert("《我爱一起》");rn</SCRIPT>';
    var Encode=Senc.EncodeScriptFile(".htm",code,0,"");
    alert(Encode);
    </SCRIPT>

      编码后的结果如下:

    <SCRIPT LANGUAGE="JScript.Encode">#@~^FgAAAA==@#@&lsDD`J黑客防线r#p@#@&FgMAAA==^#~@</SCRIPT>

      够难看懂得吧?但相应的解密工具早已出来,而且连解密网页都有!因为其解密网页代码过多,我就不多说拉!给大家介绍一下我独创的解密代码,如下:

    <SCRIPT LANGUAGE="JScript.Encode">
    function decode()
    alert(decode.toString());
    </SCRIPT>

      咋样?够简单吧?它是原理是:编码后的代码运行前IE会先对其进行解码,如果我们先把加密的代码放入一个自定义函数如上面的decode()中,然后对自定义函数decode调用toString()方法,得到的将是解码后的代码!

      如果你觉得这样编码得到的代码LANGUAGE属性是JScript.Encode,很容易让人识破,那么还有一个几乎不为人知的window对象的方法execScript(),其原形为:

      window.execScript( sExpression, sLanguage )

      参数:

    sExpression:  必选项。字符串(String)。要被执行的代码。

    sLanguage :  必选项。字符串(String)。指定执行的代码的语言。默认值为 Microsoft JScript

    使用时,前面的"window"可以省略不写!

      利用它我们可以很好的运行编码后的javascript代码,如下:

    <SCRIPT LANGUAGE="javascript">
    execScript("#@~^FgAAAA==@#@&lsDD`J我爱一起r#p@#@&FgMAAA==^#~@","JScript.Encode")
    </SCRIPT>

      你可以利用方法二对其中的""号内的字符串再进行编码,使得"JScript.Encode"以及编码特征码"#@~^"不出现,效果会更好!

      四:任意添加NUL空字符(十六进制00H)

      一次偶然的实验,使我发现在HTML网页中任意位置添加任意个数的"空字符",IE照样会正常显示其中的内容,并正常执行其中的javascript 代码,而添加的"空字符"我们在用一般的编辑器查看时,会显示形如空格或黑块,使得原码很难看懂,如用记事本查看则"空字符"会变成"空格",利用这个原理加密结果如下:(其中显示的"空格"代表"空字符")

    <S C RI P T L ANG U A G E =" J a v a S c r i p t ">
    a l er t (" 我 爱 一 起") ;
    < / SC R I P T>

      如何?是不是显得乱七八糟的?如果不知道方法的人很难想到要去掉里面的"空字符"(00H)的!

      五:无用内容混乱以及换行空格TAB大法

      在javascript代码中我们可以加入大量的无用字符串或数字,以及无用代码和注释内容等等,使真正的有用代码埋没在其中,并把有用的代码中能加入换行、空格、TAB的地方加入大量换行、空格、TAB,并可以把正常的字符串用""来进行换行,这样就会使得代码难以看懂!如我加密后的形式如下:

    <SCRIPT LANGUAGE="javascript">
    "xajgxsadffgds";1234567890
    625623216;var $=0;alert//@$%%&*()(&(^%^
    //cctv function//
    (//hhsaasajx xc
    /*
    asjgdsgu*/
    "我爱一起"//ashjgfgf
    /*
    @#%$^&%$96667r45fggbhytjty
    */
    //window
    )
    ;"#@$#%@#432hu";212351436
    </SCRIPT>

      至少如果我看到这样的代码是不会有心思去分析它的,你哪?

      六:自写解密函数法

      这个方法和一、二差不多,只不过是自己写个函数对代码进行解密,很多VBS病毒使用这种方法对自身进行加密,来防止特征码扫描!下面是我写的一个简单的加密解密函数,加密代码如下(详细参照文件"加密.htm"):

    <SCRIPT LANGUAGE="javascript">
    function compile(code)
    {
    var c=String.fromCharCode(code.charCodeAt(0)+code.length);
    for(var i=1;i<code.length;i++)
    alert(escape(c));
    }
    compile('alert("《我爱一起》");')
    </SCRIPT>

      运行得到加密结果为:

    o%CD%D1%D7%E6%9CJ%u9EF3%uFA73%uF1D4%u14F1%u7EE1Kd

      相应的加密后解密的代码如下:

    <SCRIPT LANGUAGE="javascript">
    function uncompile(code)
    {
    code=unescape(code);
    var c=String.fromCharCode(code.charCodeAt(0)-code.length);
    for(var i=1;i<code.length;i++)
    return c;
    }
    eval(uncompile("o%CD%D1%D7%E6%9CJ%u9EF3%uFA73%uF1D4%u14F1%u7EE1Kd"));
    </SCRIPT>

      七:错误的利用

      利用try{}catch(e){}结构对代码进行测试解密,虽然这个想法很好(呵呵,夸夸自己),因为实用性不大,我仅给个例子

    <SCRIPT LANGUAGE="javascript">
    var a='alert("《我爱一起》");';
    var c="";
    for(var i=0;i<a.length;i++)
    alert(c);
    //上面的是加密代码,当然如果真正使用这个方法时,不会把加密写上的
    //现在变量c就是加密后的代码
    //下面的函数t()先假设初始密码为0,解密执行,
    //遇到错误则把密码加1,然后接着解密执行,直到正确运行
    var d=c; //保存加密后的代码
    var b=0; //假定初始密码为0
    t();
    function t()catch(e){
    c="";
    for(var i=0;i<d.length;i++)
    b+=1;
    t();
    //setTimeout("t()",0);
    }
    }
    </SCRIPT>

     

    展开全文
  • //注意传入值为String类型。 //会返回一个String类型的值。 String str=Encryption_tool.Encryption(需要加密的字符串);
  • 欢迎大家关注本博,同时欢迎大家评论交流,可以给个赞哦!...  Js端使用Crypto-JS工具集,Java端使用本博《对称加密算法之Java 3DES算法应用》 提供的工具类。   交互约定:   · 交互秘钥:ABCDEFGHIJKLMNOPQRS.

    欢迎大家关注本博,同时欢迎大家评论交流,可以给个赞哦!!!

      场景分析:

      在实际应用过程中,往往存在多语言交互的需求,比如今天所属的Java-Js间的3DES加解密互通问题。之前工作中,曾经遇到过类似这样的需求,JS端加密传输信息至Java服务端,Java解密信息进行应用,在进行很多次尝试之后,终于调通了。

      Js端使用Crypto-JS工具集,Java端使用本博《对称加密算法之Java 3DES算法应用》 提供的工具类。

      交互约定:

      · 交互秘钥:ABCDEFGHIJKLMNOPQRSTUVWXYZ012345

      · 交互原文:This is a 测试数据!

      Js端代码:

      Crypto-JS是JS端的加密套件,在进行3DES加解密时,只需要按照如下引入部分组件即可。

    <html>
        <head>
            <meta http-equiv="content-type" content="text/html; charset=UTF-8">
            <title>JS:DES-DEMO测试</title>
            <script type="text/javascript" src="jquery.min.js"></script>
    		<script src="core.js"></script>
    		<script src="cipher-core.js"></script>
    		<script src="tripledes.js"></script>
            <script src="mode-ecb.js"></script>
    		<script src="enc-base64.js"></script>
            <script>
                 //DES 加密
                function encryptByDES(message, key) {
    				var deMessage = CryptoJS.enc.Utf8.parse(message);
    				var key = CryptoJS.enc.Base64.parse(key);
    				var iv = "";
    				var ivBts = CryptoJS.enc.Utf8.parse(iv);
    				var desOp = {
    					mode: CryptoJS.mode.CBC,
    					padding: CryptoJS.pad.Pkcs7,
    					iv: ivBts
    				};
    				var encrypted = CryptoJS.TripleDES.encrypt(deMessage, key, desOp);
    				var enMessage = encrypted.ciphertext.toString(CryptoJS.enc.Base64);
    				return enMessage;
    			}
                    //DES 解密
                function decryptByDES(enMessage, key) {
    				var key = CryptoJS.enc.Base64.parse(key);
    				var iv = "";
    				var ivBts = CryptoJS.enc.Utf8.parse(iv);
    				var desOp = {
    					mode: CryptoJS.mode.CBC,
    					padding: CryptoJS.pad.Pkcs7,
    					iv: ivBts
    				};
    				var decryptpted = CryptoJS.TripleDES.decrypt({
    					ciphertext: CryptoJS.enc.Base64.parse(enMessage)
    				}, key, desOp); 
                    return decryptpted.toString(CryptoJS.enc.Utf8);
                }
            </script>
            <script>
                 //加密
                function encryptStr() {
    				var strKey = $.trim($('#key').val());
    				var strMsg = $.trim($('#text1').val());
    				$('#text2').val(encryptByDES(strMsg, strKey));
    			}
    
                //解密
                function decryptStr() {
                    var strKey = $.trim($('#key').val());
                    var ciphertext = $.trim($('#text2').val());
                    $('#text3').val(decryptByDES(ciphertext, strKey));
                }
            </script>
        </head>
        <body>
            <h1>JS: 3DES-demo</h1>
            <label>key:</label>
            <input type="text" value="ABCDEFGHIJKLMNOPQRSTUVWXYZ012345" id="key" style="margin-left: 20px;">        
            <div style="margin-top: 15px;">
    		<label style="vertical-align: 10px;">原文:</label>
    		<textarea id="text1" placeholder="原文" style="width:300px;margin-left: 14px;"></textarea>        
            </div>
            <div style="margin-top: 10px;">
                <input type="button" value="加密" onclick="encryptStr();" style="vertical-align: 10px;">            
                <textarea id="text2" placeholder="加密结果" style="width:300px;margin-left: 20px;"></textarea>
            </div>
            <div style="margin-top: 5px;">            
                <input type="button" value="解密" onclick="decryptStr();" style="vertical-align: 10px;">
                <textarea id="text3" placeholder="解密结果" style="width:300px;margin-left: 20px;"></textarea>
            </div>    
    	</body>
    </html>
    

      可以注意到,在加解密时,iv变量显示是乱码值,这是根据Java端指定初始向量转换后的值,只有这样,前后端才能进行正常加解密交互。

      根据‘交互约定’,通过指定Key生成前端加密密文:UjYij2b0y/gCKLoEjxBj+oC1SwZf7OEuftmNjKYm5II=,操作结果如下图:
    在这里插入图片描述
      Java端代码:

      Java端使用本博《对称加密算法之Java 3DES算法应用》提供的工具类,测试类如下:

    package com.arhorchin.securitit.enordecryption.des;
    
    /**
     * @author Securitit.
     * @note TripleDESJavaJs测试类.
     */
    public class TripleDESJavaJsTester {
    
        public static void main(String[] args) {
            // 随机一个32位串作为秘钥.
            String desKey = "ABCDEFGHIJKLMNOPQRSTUVWXYZ012345";
            String plainText = null;
            String cipherText = null;
    
            // 数据解密.
            cipherText = "UjYij2b0y/hCyW5MBuaevegjGLGkSyVA";
            plainText = TripleDESUtil.strDecode(cipherText, desKey);
            System.out.println("解密明文:" + plainText);
        }
    
    }
    

      测试类运行结果:

    解密明文:This is 测试数据!
    

      总结:

      · 通过上面的执行结果可以看出,Js端加密数据可以在Java端正常解密。

      · 上面示例只演示了Js端加密,Java端解密的过程,反向的操作亦是可以的,感兴趣的同学可以按照上面的方式进行测试。

      · 前端代码可以直接复制使用,无需进行多余更改,若更换初始向量,需将Js端iv重新初始化,否则Js端和Java端无法通用。

    本博微信公众号“超哥说码”,欢迎大家订阅,公众号正在完善中,会及时将更优质的博文推送于您!
    在这里插入图片描述

    展开全文
  • 用于使用 DES 算法(仅 ECB 模式和 HEX 密码)加密和解密数据的节点 DES 加密工具 - 为学校项目开发。 用法 首先确保已经安装并运行,然后执行以下命令。 cd 'wherever you want it' && git clone git@github....
  • 本文实例为大家分享了JavaScript SHA512加密算法,供大家参考,具体内容如下 /* * A JavaScript implementation of the Secure Hash Algorithm, SHA-512, as defined * in FIPS 180-2 * Version 2.2 Copyright ...
  • 加密算法

    千次阅读 2017-04-05 11:00:29
    对于加密算法,相信不少开发者也有所耳闻,比如MD5加密,Base64加密,DES加密,AES加密,RSA加密等等。在这里我主要向大家介绍一下我在开发过程中使用到的加密算法,RSA加密算法+AES加密算法。简单地介绍一下这两种...
  • 3des md5 base64 util 常用加密算法对称加密和不对称加密
  • Android-RSA算法加密解密

    千次阅读 2016-11-24 18:07:11
    安卓中利用RSA算法加密和解密 整个流程大致为:生成密钥对->获取公私钥->对明(密)文加(解)密。 package com.cc.encrypttest;import android.util.Base64;import java.security.InvalidKeyException; import java....
  • Js加密工具 crypto-js

    2019-12-11 18:00:33
    https://www.oschina.net/p/crypto-js 示例 var digest = Crypto.MD5("Message"); var digestBytes = Crypto.MD5("Message", { asBytes: true }); var digestString = Crypto.MD5("Message", { asString: true }...
  • ByteUtil.js,用于通用的字节处理. // 左移 export let left_move = (text, number) => { if (text == null) { return null; } let result = ""; for (let i = number; i < text.length; i++) { result ...
  • 基于网络的加密工具集合,用于和使用的方案/算法。 该工具包的构建考虑了教育目的! 它旨在尝试不同的方案和算法,以了解它们的工作原理。 但是,在使用实时/实时/主数据/密钥/凭证时,您必须格外小心! Web浏览器...
  • 现在网上很多Javascript都进行了压缩,同时代码变得不可直接阅读,也相当于一种简单的加密了,本文对其中一种典型的算法进行分析,介绍如何解密代码以及重新实现的压缩工具算法。典型代码如下:eval(function(E,I,A,...
  • 深入浅出用户认证鉴权使用非对称加密算法加密登录面临的问题明文密码登录MD5/BASE64 加密登录解决方案对称加密与非对称加密对称加密非对称加密在登录过程中的使用 使用非对称加密算法加密登录 面临的问题 明文密码...
  • 对称加密算法和非对称加密算法

    千次阅读 2017-06-16 18:47:36
    (一)对称加密(Symmetric Cryptography)对称加密是最快速、最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret key),这种方法在密码学中叫做对称加密算法。对称加密有很多...
  • RSA非对称加密算法(表单提交时,前端js加密,后端java解密非对称加密算法需要的工具前端jsp页面js代码加密解密的工具类产生公钥的类处理登陆请求的类加密成功的密码 非对称加密算法 非对称加密算法是一种密钥的...
  • MD5加密+签名算法Sign生成 工具类。 用于调式远程接口或者做用户加密登录等等。 亲自调试过,都是可以用的。 不用自己再自己去写算法轮子! 大家都搬起来!
  • 使用微信支付签名MD5加密算法。可以使用,可以根据微信签名工具验证,是一样的。 如果提示“签名失败“,就要考虑到key只是否一致。统一下单和发起支付时的key值要一样的。
  • 项目的复杂度在于国密的非对称加密算法SM2的Java及JS实现。 Java版比较好办,较新版本的bouncycastle就支持了SM2/SM3/SM4,麻烦在于JS版,找了很多都有问题,直到遇到了这个项目:...
  • 简述一下: RSA非对称加密算法, 简单理解就是: 准备两把钥匙-公钥, 私钥. ...RSA工具类里面也包含 解密js端传递来的密文方法, 以及在后台进行数据的加密解密方法. 直接开始: 1. 准备前端需要的js jque...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 27,110
精华内容 10,844
关键字:

js算法加密工具