【发布时间】:2018-03-31 16:51:58
【问题描述】:
我尝试在 java 中加密文本并在 nodejs 中解密(反之亦然)
我可以用同一种语言加密和解密,但我不能同时使用它们......
这是我在 Kotlin 中的代码:
@Throws(Exception::class)
fun encrypt(text: String, password: String?): String?
{
if (password == null)
return null
val hash = toHash(password).copyOf(16)
val keySpec = SecretKeySpec(hash, "AES")
val ivSpec = IvParameterSpec(hash)
val cipher = Cipher.getInstance("AES/CBC/PKCS5Padding")
cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec)
val results = cipher.doFinal(text.toByteArray())
return Base64.encodeToString(results, Base64.NO_WRAP or Base64.DEFAULT)
}
@Throws(Exception::class)
fun decrypt(text: String, password: String?): String?
{
if (password == null)
return null
val hash = toHash(password).copyOf(16)
val keySpec = SecretKeySpec(hash, "AES")
val ivSpec = IvParameterSpec(hash)
val cipher = Cipher.getInstance("AES/CBC/PKCS5Padding")
cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec)
return String(cipher.doFinal(Base64.decode(text, Base64.DEFAULT)))
}
这是我的 JS 代码:
function decrypt(data, password)
{
var hash = sha256(password).substring(0, 16)
var decipher = crypto.createDecipheriv('aes-128-cbc', hash, hash);
var dec = decipher.update(data, 'hex', 'utf8');
dec += decipher.final('utf8');
return dec;
}
function encrypt(data, password)
{
var hash = sha256(password).substring(0, 16)
var cipher = crypto.createCipheriv('aes-128-cbc', hash, hash);
var crypted = cipher.update(data, 'utf8', 'hex');
crypted += cipher.final('hex');
return crypted;
}
我尝试在 Java 和 nodeJS(192、128 和 256)中使用不同的块大小,但它不起作用。 我不想在 ECB 中加密,我想在 CBC 或 CTR 中实现。
请问有人知道怎么做吗?感谢您提前!
【问题讨论】:
-
您的 Kotlin 代码使用
Base64对byte[]<->String进行编码/解码,但是在 Node.js 方面,您定义它应该被视为hex。我认为这不会奏效。 -
您需要为每个编码使用相同的编码,请查看每个编码的文档。许多“新”语言想要掩盖二进制以支持字符串,但许多东西本质上是二进制的,例如加密和互联网。因此,您必须为每种语言和加密实现弄清楚这一点。
标签: java android node.js cryptography kotlin