加密思路
- 通过charCodeAt获取到每一个字符串对应的Unicode码点,
- 让其码点加上一些常量;再通过fromCharCode获取到该码点对应的字符串;
- 把字符串相加,通过escape方法进行编码。
API介绍
String.fromCharCode()
String对象提供的静态方法(即定义在对象本身,而不是定义在对象实例的方法),主要是String.fromCharCode()。该方法的参数是一个或多个数值,代表 Unicode 码点,返回值是这些码点组成的字符串。
String.fromCharCode(60) //"<"
String.charCodeAt()
返回字符串指定位置的Unicode码点(十进制),相当于
String.fromCharCode()的逆操作。
- 参数为空,返回首字符对应的Unicode码点,如果参数为负或者大于等于字符串长度,返回NaN
- charCodeAt方法返回的 Unicode 码点不会大于65536(0xFFFF),也就是说,只返回两个字节的字符的码点。如果遇到码点大于 65536 的字符(四个字节的字符),必需连续使用两次charCodeAt,不仅读入charCodeAt(i),还要读入charCodeAt(i+1),将两个值放在一起,才能得到准确的字符。
'123'.charCodeAt(0) //49
escape()
编码对字符串进行编码。URL编码方式。
escape(">") //"%3E"
思考:
- 第一个字符的处理是获取到码点后,与字符串长度、时间戳前六位相加(时间短时间内不会变,长时间内是会变);
- 之后字符串的处理 是获取到对应的码点,与前一个字符码点相加。
解密思路
- 通过unescape进行URL解码,
- 通过charCodeAt获取到第一个字符的码点,然后减去字符长度、时间戳, 然后把码点通过fromCharCode转成原始字符;
- 之后字符串的解密是把当前码点减去原始字符串前一位的码点。然后通过fromCharCode转成原始字符串。
const key = new Date().valueOf().toString()
function lock(o) {
var d = String.fromCharCode(o.charCodeAt(0) + o.length + parseInt(key.slice(0, 5)));
for (var k = 1; k < o.length; k++) {
d += String.fromCharCode(o.charCodeAt(k) + o.charCodeAt(k - 1));
}
console.log(escape(d), 'answer');
}
lock("<hg'rvn']v�{ahmF")
const URI = "%u3C2F%A4%CF%8E%99%E8%E4%95%84%D3%8F%94%DC%C9%D5%B3"
// %u3C30%A4%CF%8E%99%E8%E4%95%84%D3%8F%94%DC%C9%D5%B3
function unLock(o) {
let S = unescape(o);
let d = String.fromCharCode(S.charCodeAt(0) - S.length + 1 - parseInt(key.slice(0, 5)));
for (let i = 1; i < S.length; i++) {
d += String.fromCharCode(S.charCodeAt(i) - d.charCodeAt(i - 1));
}
console.log(d);
}
unLock(URI)
参考文章:
http://javascript.ruanyifeng.com/stdlib/string.html
https://www.w3schools.com/jsref/jsref_escape.asp
网友评论