nodejs和java中的des/3des加密解密對比

直接上代碼(對比結果在最後),注意DES和DESede的區別


【Node.js】

var assert = require('assert');  
var crypto = require('crypto');  

function test_des(param) {  
    var key = new Buffer(param.key);  
    var iv = new Buffer(param.iv ? param.iv : 0)  
    var plaintext = param.plaintext  
    var alg = param.alg  
    var autoPad = param.autoPad  

    //encrypt  
    var cipher = crypto.createCipheriv(alg, key, iv);  
    cipher.setAutoPadding(autoPad)  //default true  
    var ciph = cipher.update(plaintext, 'utf8', 'hex');  
    ciph += cipher.final('hex');  
    console.log(alg, ciph)  

    //decrypt  
    var decipher = crypto.createDecipheriv(alg, key, iv);  
    cipher.setAutoPadding(autoPad)  
    var txt = decipher.update(ciph, 'hex', 'utf8');  
    txt += decipher.final('utf8');      
    assert.equal(txt, plaintext, 'fail');  
}  

test_des({  
    alg: 'des-ecb',  
    autoPad: true,  
    key: '01234567',  
    plaintext: '1234567812345678',  
    iv: null  
})  

test_des({  
    alg: 'des-cbc',  
    autoPad: true,  
    key: '01234567',  
    plaintext: '1234567812345678',  
    iv: '12345678'  
})  

test_des({  
    alg: 'des-ede3',    //3des-ecb  
    autoPad: true,  
    key: '0123456789abcd0123456789',  
    plaintext: '1234567812345678',  
    iv: null  
})  

test_des({  
    alg: 'des-ede3-cbc',    //3des-cbc  
    autoPad: true,  
    key: '0123456789abcd0123456789',  
    plaintext: '1234567812345678',  
    iv: '12345678'  
})  

【Java】

import javax.crypto.Cipher;  
import javax.crypto.SecretKey;  
import javax.crypto.spec.IvParameterSpec;  
import javax.crypto.spec.SecretKeySpec;  

import org.apache.commons.codec.binary.Hex;  
import org.junit.Test;  
@Test  
    public void encrypt_3des_ecb() throws Exception {  
        byte[] key = "0123456789abcd0123456789".getBytes();       
        byte[] plainText = "1234567812345678".getBytes();  

//      KeySpec myKeySpec = new DESedeKeySpec(key);  
//      SecretKeyFactory mySecretKeyFactory = SecretKeyFactory.getInstance("DESede");  
//      SecretKey secretKey = mySecretKeyFactory.generateSecret(myKeySpec);  
        SecretKey secretKey = new SecretKeySpec(key, "DESede");  
        //encrypt  
        Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");  
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);  
        byte[] encryptedData = cipher.doFinal(plainText);  
        System.out.println("encrypt_3des_ecb: " + Hex.encodeHexString(encryptedData));  

        //decrypt  
        cipher.init(Cipher.DECRYPT_MODE, secretKey);  
        byte[] decryptPlainText = cipher.doFinal(encryptedData);  
        org.junit.Assert.assertArrayEquals(decryptPlainText, plainText);          
    }  

    @Test  
    public void encrypt_3des_cbc() throws Exception {  
        byte[] key = "0123456789abcd0123456789".getBytes();       
        byte[] plainText = "1234567812345678".getBytes();  
        IvParameterSpec iv = new IvParameterSpec("12345678".getBytes());  

        SecretKey secretKey = new SecretKeySpec(key, "DESede");  
        //encrypt  
        Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");  
        cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);  
        byte[] encryptedData = cipher.doFinal(plainText);  
        System.out.println("encrypt_3des_cbc: " + Hex.encodeHexString(encryptedData));  

        //decrypt  
        cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);  
        byte[] decryptPlainText = cipher.doFinal(encryptedData);  
        org.junit.Assert.assertArrayEquals(decryptPlainText, plainText);              
    }     

    @Test  
    public void encrypt_des_ecb() throws Exception {  
        byte[] key = "01234567".getBytes();       
        byte[] plainText = "1234567812345678".getBytes();  

        SecretKey secretKey = new SecretKeySpec(key, "DES");  
        //encrypt  
        Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");  
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);          
        byte[] encryptedData = cipher.doFinal(plainText);  
        System.out.println("encrypt_des_ecb: " + Hex.encodeHexString(encryptedData));  

        //decrypt  
        cipher.init(Cipher.DECRYPT_MODE, secretKey);  
        byte[] decryptPlainText = cipher.doFinal(encryptedData);  
        org.junit.Assert.assertArrayEquals(decryptPlainText, plainText);  
    }  

    @Test  
    public void encrypt_des_cbc() throws Exception {  
        byte[] key = "01234567".getBytes();       
        byte[] plainText = "1234567812345678".getBytes();  
        IvParameterSpec iv = new IvParameterSpec("12345678".getBytes());   

        SecretKey secretKey = new SecretKeySpec(key, "DES");  
        //encrypt  
        Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");  
        cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);          
        byte[] encryptedData = cipher.doFinal(plainText);  
        System.out.println("encrypt_des_cbc: " + Hex.encodeHexString(encryptedData));  

        //decrypt  
        cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);  
        byte[] decryptPlainText = cipher.doFinal(encryptedData);  
        org.junit.Assert.assertArrayEquals(decryptPlainText, plainText);  
    }     

【結果】

nodejs 輸出結果 :
des-ecb cb22e0c49a73e0e0cb22e0c49a73e0e008bb5db6b37c06d7
des-cbc 388d44f8b0f709c0915e14abc8eb782604ae07d96110ab0d
des-ede3 0a5f769c1a6eb5710a5f769c1a6eb5713bba29a037c699da
des-ede3-cbc 99988858eabe3e95ace8349b9e19dda66abb82b44b5f8f62
java輸出結果 :
encrypt_des_ecb: cb22e0c49a73e0e0cb22e0c49a73e0e008bb5db6b37c06d7
encrypt_des_cbc: 388d44f8b0f709c0915e14abc8eb782604ae07d96110ab0d
encrypt_3des_ecb: 0a5f769c1a6eb5710a5f769c1a6eb5713bba29a037c699da
encrypt_3des_cbc: 99988858eabe3e95ace8349b9e19dda66abb82b44b5f8f62

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章