1 实现背景
最近由于业务的需求, app 不让明文传输 mobile, 所以就自己动手加密了一下.
对于加密解密 mobile app, 后台, h5 都有用到. 所以 java php js 都有实现.
2 加密的原理
首先把字符串转成字节数组, 然后取字符的高四位和第四位, 用高四位加上字节索引, 产生一个新的数字, 然后作为索引在加密字符串里找到相应的数字, 同理低四为也用同样的方法找到与子对应的字符.
然后把每个字节产生的字符拼接在一起, 此时的字符串就是加密后的字符串了. 这里加上字节所在的索引目的是使加密后的字符没有规律可循, 字符串更安全. 这里要注意的是 hexstr 里面的字符不要重复, 不然加密后就解密不了.(这里加密的字符串是 10 个字符, 如果要加密更长的请改变 key() 的长度)
2.1 java 实现
- import java.io.UnsupportedEncodingException;
- public class DemoTest {
- private static String hexStr = "53gtbc2has1d8jef49v";
- public static void main(String[] args) throws UnsupportedEncodingException {
- String str = "0900504867";
- System.out.println(str);
- str = stringEncode((str));
- System.out.println(str);
- System.out.println(hexStr2Str((str)));
- }
- public static String stringEncode(String str) {
- String hexStr = "as15d8ef49v3gtbjc2h";
- char[] chars = hexStr.toCharArray();
- StringBuilder sb = new StringBuilder("");
- byte[] bs = str.getBytes();
- int bit;
- for (int i = 0; i <bs.length; i++) {
- bit = (bs[i] & 0x0f0)>> 4;
- sb.append(chars[bit + i]);
- bit = bs[i] & 0x0f;
- sb.append(chars[bit + i]);
- }
- return sb.toString();
- }
- public static String hexStr2Str(String hexString) throws UnsupportedEncodingException {
- int len = hexString.length()>>1;
- byte[] bytes = new byte[len];
- byte high = 0;
- byte low = 0;
- for(int i=0;i<len;i++){
- // 右移四位得到高位
- high = (byte)((hexStr.indexOf(hexString.charAt(2*i))-i)<<4);
- low = (byte)(hexStr.indexOf(hexString.charAt(2*i+1)) - i);
- bytes[i] = (byte) (high|low);// 高地位做或运算
- }
- return new String(bytes);
- }
- }
2.2 php 实现解密
- const DECODE_KEY = "53gtbc2has1d8jef49v";
- function decode($str) {
- $str = str_split($str, 1);
- $len = (count($str))>>1;
- $charts = '';
- for ($i=0; $i <$len; $i++) {
- $hight = strpos(self::DECODE_KEY, $str[$i<<1]) - $i;
- $low = strpos(self::DECODE_KEY, $str[($i<<1) + 1]) - $i;
- $char = $hight<<4 | $low;
- $charts .= chr($char);
- }
- return $charts;
- }
2.3 javascript 实现加密解密
- var key = "53gtbc2has1d8jef49v";
- service.strDencode = function(str) {
- if (!str) {
- return '';
- }
- str = str.split("");
- len = (str.length)>>1;
- charts = '';
- for (i=0; i <len; i++) {
- hight = key.indexOf(str[i<<1]) - i;
- low = key.indexOf(str[(i<<1) + 1])- i;
- char = hight<<4 | low;
- charts += String.fromCharCode(char);
- }
- return charts;
- }
- service.strEncode = function(str) {
- if (!str) {
- return '';
- }
- str = str.split("");
- chars = key.split("");
- str = str.map(function(item,index){
- code = item.charCodeAt();
- hight = (code & 0x0f0)>> 4;
- low = (code & 0x0f);
- return chars[hight + index] + chars[low + index];
- });
- return str.join("");
- }
来源: https://www.cnblogs.com/guoke-jsp/p/9083472.html