电话号码对称加密
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("");
}