PHP加密算法MCRYPT_RIJNDAEL_128,Java和Nodejs实现

547 阅读1分钟

在使用360搜索身份认证中有提及PHP的MCRYPT_RIJNDAEL_128加密算法,这里简单做一个示例。

360官方说明

AES对称加密(AES模式为CBC,加密算法MCRYPT_RIJNDAEL_128)对MD5加密后的密码实现对称加密。秘钥是apiSecret 的前16位,向量是后16位,加密结果为64位数字和小写字母

PHP ENCRYPTION

because of default zero padding

  • AEC
  • 128
  • 模式CBC
  • NoPadding

Nodejs

首先提供官方文档 Nodejs crypto 文档

代码

// yarn add crypto 或 npm install crypto

// 导入模块
const crypto = require('crypto');

/**
 * 最终代码
 * 128对应key为16位
 * 256对应key为32位
 */
const cipher = crypto.createCipheriv("aes-128-cbc", key, iv);
cipher.setAutoPadding(false);
let encrypted = cipher.update(data, 'utf8', 'hex');
encrypted += cipher.final('hex');

Java

import javax.crypto

// AES对称加密(AES模式为CBC,加密算法MCRYPT_RIJNDAEL_128)
fun encode(data: String, key: String, iv: String): String {
    val skeySpec = SecretKeySpec(key.toByteArray(), "AES")
    val ivSpec = IvParameterSpec(iv.toByteArray())
    val cipher: Cipher = Cipher.getInstance("AES/CBC/NoPadding")
    cipher.init(Cipher.ENCRYPT_MODE, skeySpec, ivSpec)
    val encrypted: ByteArray = cipher.doFinal(data.toByteArray())
    return Hex.encodeHexString(encrypted)
}