簡體   English   中英

將NodeJS代碼片段轉換為Java代碼進行加密/解密

[英]Convert NodeJS code snippet into Java code for encryption/decryption

我想將下面這段代碼轉換成 java 但我做不到,基本上我必須在 Java 中實現“加密”模塊。提前致謝!

        let encKey = "0Z8ZUcy1Qh8lnt199MTwTPEe2g1E2tE3";
        encKey = crypto.createHash('sha256').update(encKey).digest('bin').slice(0, 32);
        let char = String.fromCharCode(0x0);
        let iv = char + char + char + char + char + char + char + char + char + char + char + char + char + char + char + char;
        let decryptor = crypto.createDecipheriv("aes-256-cbc", encKey, iv);
        let dec = decryptor.update(someAuthString, 'base64', 'utf8') + decryptor.final('utf8');
        dec = removePKCS5Padding(dec);

移除PKCS5Padding

function removePKCS5Padding(text) {
    let pad = ord(text[text.length - 1]);
    pad = text.substr(0, -1 * pad)
    if (_.isEmpty(pad)) {
        return text;
    } else {
        return pad;
    }
}

首先,您不需要實現整個模塊,只需實現其中的特定算法。

其次,編寫該代碼的人不知道他們在做什么。 SHA-256 已經生成了一個 32 字節的值(總是),所以.slice(0,32)什么也做不了。 塊模式的createCipher[iv]createDecipher[iv]已經自動添加和刪除“PKCS5”填充,除非明確禁用。 (在 PKCS5v2.1 之前,技術上說 PKCS7 或 PKCS5/7 更正確,但實際上人們通常不會打擾,Java 稱它為 PKCS5。OpenSSL,nodejs 加密在內部使用,punts 並稱它為 PKCS 填充 - - 盡管有幾個完全不同的 PKCS1 填充,並且 OpenSSL 也實現了。)

byte[] keyIn = "0Z8ZUcy1Qh8lnt199MTwTPEe2g1E2tE3" .getBytes("ASCII"); 
    // if any non-ASCII char(s) must select same encoding nodejs does, I believe utf8
    // instead of string form can use e.g. StandardCharsets.US_ASCII
byte[] keyHash = MessageDigest.getInstance("SHA-256") .doFinal(keyIn);
    // or "sha-256" Java crypto names are case-insensitive
    // can separate steps with hasher = .getInstance(); hasher.update(keyIn); result = hasher.doFinal()
    // but cannot do fluent-style result = .getInstance() .update(keyIn) .doFinal()
byte[] iv = new byte[16]; // Java automatically fills numeric array with (binary) zeros
Cipher dec = Cipher.getInstance("AES/CBC/PKCS5Padding");
dec.init (Cipher.DECRYPT_MODE, new SecretKeySpec(keyHash,"AES"), new IvParameterSpec(iv));
String clear = new String( dec.doFinal (Base64.getDecoder().decode( someAuthString )), "UTF-8");
    // or StandardCharsets.UTF_8

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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