Skip to content

加密与解密

>

加密算法

base64

Base64 编码是将二进制数据转换为可打印的 ASCII 字符的一种编码方式。它将输入数据按每 3 个字节一组进行分组,然后将每组转换为 4 个 6 位的编码字符。

码表如下:

但如果输入数据的字节长度不是 3 的整数倍,在编码的末尾就会出现 = 号来进行填充。

例如,如果输入数据的字节长度正好是 3 的整数倍,编码结果中就不会有 =

base64url

标准的 Base64 编码使用的字符集包括“+”、“/”和“=”,然而“+”在 URI 地址中会被解释为空格,“/”对于 URL 地址和文件系统路径来说是目录分隔符,“=”用于在查询字符串中表示键值对。为了避免这些特殊字符在 URL 或文件名中引起的问题,Base64URL 编码做了以下修改:

  • 将“+”替换为“-”(减号);
  • 将“/”替换为“_”(下划线);
  • 不使用填充字符“=”;
  • 禁止使用换行符等。

aes算法

对称加密

node.js代码:使用的算法aes-256-cbc中的数字和key的位数是对应的

256表示加密后的bit数

aes192,key要24 bytes

aes256,key要32 bytes

yaml
const arg = 'aes-256-cbc'
function Encode2(data, key) {
  const iv = crypto.randomBytes(16)
  const cliper = crypto.createCipheriv(arg, key, iv)
  let encrypted = cliper.update(data, 'utf8', 'base64url')
  encrypted += cliper.final('base64url')
  let text = encrypted + '|' + iv.toString('base64url')
  return text
}

function Decode2(data, key) {
  const [data_str, iv_str] = data.split('|')
  const iv = Buffer.from(iv_str, 'base64url')
  const decipher = crypto.createDecipheriv(arg, key, iv)
  let decrypted = decipher.update(data_str, 'base64url', 'utf8')
  decrypted += decipher.final('utf8')
  return decrypted
}

const key = crypto.createHash('sha256').update('1234567890123456').digest()  
const src_test = '耗损在需要'
const res = Encode2(src_test, key)
console.log('加密后的文本:', res)
const res2 = Decode2(res, key)
console.log('解密后的文本:', res2)

hash算法

node.js实现

yaml
crypto.createHash('sha256').update('1234567890123456').digest()