簡體   English   中英

Java代碼Cipher.doFinal(byte [])的Javascript / NodeJS等效代碼?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM