![](/img/trans.png)
[英]What does the return value of Cipher.dofinal(byte[]) mean in Java?
[英]Javascript/NodeJS equivalent code for the Java code Cipher.doFinal(byte[])?
我正在將一些服務器端Java代碼遷移到新的NodeJS服務器。 我正在尋找Javascript中與Java的Cipher.doFinal(byte [])等效的方法調用。請注意,我不能使用NodeJS緩沖區,因為它們不支持負的Byte值。 因此,要進行加密,我需要一個接受正負數數組的方法。
這是我目前與此問題相關的所有信息:
節點JS / Javascript:
var crypto = require('crypto'); var cipher = crypto.createCipher('aes256',key);
Java(javax.crypto.Cipher):
Cipher cipher;
SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
try {
cipher = Cipher.getInstance("AES");
} catch (NoSuchAlgorithmException e) {
} catch (NoSuchPaddingException e) {
}try {
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
} catch (InvalidKeyException e) {
}
在Java代碼的稍后部分,我將這種方法稱為Iv表示初始化矢量: byte[] newIv = cipher.doFinal(myIv);
如何在JavaScript中獲得與doFinal Java方法相同的結果?
您可以使用NodeJS緩沖區。 Java中的字節數組可能只包含有符號字節,但是這些字節與無符號字節的處理方式沒有任何不同。 僅實際位的值重要。 如果需要直接處理字節,通常最好使用十六進制。 您可以通過執行b & 0xFF
轉換為正整數值,而可以通過執行(byte) b
來執行相反的操作。
當然,您也可以在NodeJS中執行類似的操作以使NodeJS處理帶符號的數字,但是將鍵,IV等視為無符號是很常見的。
現在,對於Java AES加密,您正在使用不安全的"AES/ ECB /PKCS5Padding"
模式,因為Oracle Java JCE提供程序默認為ECB加密模式和PKCS#7填充(Java不正確地命名為"PKCS5Padding"
)。 ECB不使用IV,因此您可以忽略IV的值。 奇怪的是, 你必須使用crypto.createCipheriv(algorithm, key, iv)
作為crypto.createCipher(算法,密碼)使用密碼,而不是關鍵的。 當然,如果您的密鑰的大小確實為256位,則還應該對NodeJS / OpenSSL使用算法"AES-256-ECB"
。
事實證明,您可以按以下方式放置一個空IV:
var cipher = require('crypto').createCipheriv('aes-256'ecb', key, '');
至於替換方法,只需將舊的IV臨時存儲為新的IV,然后嘗試使用舊的IV更新該新的IV。 這是使用上面關於初始化向量創建為緩沖區的一些代碼在NodeJS中的樣子:
var newIV = oldIV.slice(); newIV = cipher.update(newIV); oldIV = newIV;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.