今天靠大佬的帮助,成功的解决了一个弄了好久的问题。起因就是我们要对一个手机号进行加密。
加密方式是把一个字符串进行MD5加密之后,得到原始 16 字符二进制格式。然后把得到的这个字符作为AES的key对手机号加密,最后得到这结果。
最奇怪的就是得到二进制格式,我以前做过md5加密,得到的都是字符串,不管是32位的,还是16位,但是这次居然要二进制。最开始去百度,发现网上没有,最后还是问的我们大佬,需要引入一个crypto-js.min.js的文件,然后这里面能得到二进制格式的字符。下面我把这个文件放在网盘上,(链接:https://pan.baidu.com/s/1XQACI7FlAap2oclg8TLlnw 提取码:hejh ___)___还有就是我们的代码放在下面,为了私密。我把一些代码注释了
1 var jsonStr = "123456";
2 var key = CryptoJS.MD5(jsonStr);
3 var dataStr = mobile;
4 var encryptedData = CryptoJS.AES.encrypt(dataStr, key, {
5 mode: CryptoJS.mode.ECB,
6 padding: CryptoJS.pad.Pkcs7
7 });
8 var word = encryptedData.ciphertext;
9 var encryptedBase64Str = CryptoJS.enc.Base64.stringify(word);
其中jsonStr为需要加密的字符串,第二行得到的key就是二进制字符,大家可以自行的打印查看,然后从第四行开始,是进行AES加密。最后进行一个base64加密,然后这个encryptedBase64Str为最后加密的得到的东西。
同样的后台得到我传过去的这个东西,也是需要对jsonStr进行md5 二进制加密,得到AES解密的密钥,然后进行AES解密。得到原始的数据值,应该就是123456就对了。
这里忍不住吐槽一下,人家php能直接获取到这个二进制字符
1 <?php
2 $str = "Shanghai";
3 echo "字符串:".$str."<br>";
4 echo "TRUE - 原始 16 字符二进制格式:".md5($str, TRUE)."<br>";
5 echo "FALSE - 32 字符十六进制格式:".md5($str)."<br>";
6 ?>
羡慕。