电话号码对称加密

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("");
    }

  

猜你喜欢

转载自www.cnblogs.com/guoke-jsp/p/9083472.html