Maison > interface Web > js tutoriel > Solution à l'incohérence entre le cryptage AES et d'autres langages dans les compétences Node.js_javascript

Solution à l'incohérence entre le cryptage AES et d'autres langages dans les compétences Node.js_javascript

WBOY
Libérer: 2016-05-16 16:56:15
original
1651 Les gens l'ont consulté

Exemple 1 :

J'ai été troublé par un problème ces jours-ci. Le cryptage AES de Nodejs est incompatible avec le cryptage de Java et C#. Bien entendu, cela ne peut pas être déchiffré. J'ai longtemps lutté : je n'y arrivais finalement plus, alors j'ai jeté un œil au code source, sinon il faudrait que je continue à lutter. On dit sur Internet que l'implémentation habituelle de nodejs AES est différente des autres langages. D'accord~~peut-être.
module crypto pour nodejs.

Copier le code Le code est le suivant :

var crypto = require(' crypto') ;

var data = "156156165152165156156";
console.log('Original cleartext: ' data);
var algorithm = 'aes-128-ecb';
var key = '78541561566';
var clearEncoding = 'utf8';
//var cipherEncoding = 'hex';
//Si la ligne suivante n'est pas commentée, le texte en clair final est erroné.
var cipherEncoding = 'base64';
/*Cryptage*/
var cipher = crypto.createCipher(algorithme, clé);

var cipherChunks = [];
cipherChunks.push(cipher.update(data, clearEncoding, cipherEncoding));
cipherChunks.push(cipher.final(cipherEncoding));
console.log( cipherEncoding ' ciphertext: ' cipherChunks.join(''));
/*decryption*/
var decipher = crypto.createDecipher(algorithm, key);
var plainChunks = [];
pour (var i = 0;i < cipherChunks.length;i ) {
plainChunks.push(decipher.update(cipherChunks[i], cipherEncoding, clearEncoding));

>
plainChunks.push(decipher.final(clearEncoding));
console.log("Texte brut UTF8 déchiffré : " plainChunks.join(''));


En effet, non Faux~~Le cryptage et le déchiffrement ont réussi. Mais c’est différent du chiffrement en Java et C#. Dieu. Je pense que tout le monde a du mal ici, n'est-ce pas ? En fait, ajoutez simplement un vecteur et ce sera cohérent. Il existe trop peu de ressources disponibles en ligne. C’est pourquoi j’ai lutté avec ça pendant si longtemps. Eh bien, le code correct est :
Copiez le code Le code est le suivant :

var crypto = require('crypto');

var data = "156156165152165156156";
console.log('Original cleartext: ' data);
var algorithm = 'aes-128-ecb';
var key = '78541561566';
var clearEncoding = 'utf8';
var iv = "";
//var cipherEncoding = 'hex';
//Si la ligne suivante n'est pas commentée, le texte en clair final est erroné.
var cipherEncoding = 'base64';
var cipher = crypto.createCipheriv(algorithme, clé,iv);

var cipherChunks = [];
cipherChunks.push(cipher.update(data, clearEncoding, cipherEncoding));
cipherChunks.push(cipher.final(cipherEncoding));
console.log( cipherEncoding ' texte chiffré : ' cipherChunks.join(''));

var decipher = crypto.createDecipheriv(algorithm, key,iv);
var plainChunks = [];
for (var i = 0;i < cipherChunks.length;i ) {
plainChunks .push(decipher.update(cipherChunks[i], cipherEncoding, clearEncoding));

>
plainChunks.push(decipher.final(clearEncoding));
console.log("Texte brut UTF8 déchiffré : " plainChunks.join(''));


La comparaison a révélé que , Le cryptage est cohérent. D'accord, nœud ~~~ Je te déteste d'avoir perdu ma journée.


Exemple 2 :

Au travail, j'ai rencontré le cryptage nodejs via le décryptage AES et Java du client Android. J'ai convenu que nodejs devait également déchiffrer le contenu crypté par le client Android. Après avoir interrogé les données, j'ai découvert que les deux résultats de cryptage étaient différents. a constaté que le côté Java doit crypter à nouveau avec MD5. Voici le contenu du cryptage aes ecb, vous devez également crypter la clé secrète MD5 :

.


nodejs :

Copier le code Le code est le suivant :

/**
* cryptage aes
* @param data
* @param secretKey
*/ 
encryptUtils.aesEncrypt = function(data, secretKey) { 
    var cipher = crypto.createCipher('aes-128-ecb',secretKey); 
    return cipher.update(data,'utf8','hex') cipher.final('hex'); 


/**
* décryptage aes
* @param data
* @param secretKey
* @returns {*}
*/ 
encryptUtils.aesDecrypt = function(data, secretKey) { 
    var cipher = crypto.createDecipher('aes-128-ecb', clé secrète); 
    return cipher.update(data,'hex','utf8') cipher.final('utf8'); 


java :
复制代码 代码如下 :

package com.iofamily.util; 

importer java.security.MessageDigest ; 

importer javax.crypto.Cipher ; 
importer javax.crypto.spec.SecretKeySpec ; 

/**
* Chiffrement AES, cohérent avec Nodejs
* @author lmiky
* @date 2014-2-25
*/ 
public class AESForNodejs { 
    public static final String DEFAULT_CODING = "utf-8"; 

    /**
     * 解密
     * @author lmiky
     * @date 2014-2-25
     * @param chiffré
     * @param seed
     * @return
     * @throws Exception
    */ 
    le décryptage de chaîne statique privé (chaîne chiffrée, graine de chaîne) génère une exception { 
        byte[] keyb = seed.getBytes(DEFAULT_CODING); 
        MessageDigest md = MessageDigest.getInstance("MD5"); 
        byte[] thedigest = md.digest(keyb); 
        SecretKeySpec skey = new SecretKeySpec(thedigest, "AES"); 
        Cipher dcipher = Cipher.getInstance("AES"); 
        dcipher.init(Cipher.DECRYPT_MODE, skey); 

        byte[] clearbyte = dcipher.doFinal(toByte(encrypted)); 
        return new String(clearbyte); 
    } 

    /**
     * 加密
     * @author lmiky
     * @date 2014-2-25
     * @param content
     * @param key
     * @return
     * @throws Exception
    */ 
    le chiffrement de chaîne statique public (contenu de la chaîne, clé de chaîne) génère une exception { 
        byte[] input = content.getBytes(DEFAULT_CODING); 

        MessageDigest md = MessageDigest.getInstance("MD5"); 
        byte[] thedigest = md.digest(key.getBytes(DEFAULT_CODING)); 
        SecretKeySpec skc = new SecretKeySpec(thedigest, "AES"); 
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); 
        cipher.init(Cipher.ENCRYPT_MODE, skc); 

        byte[] cipherText = new byte[cipher.getOutputSize(input.length)]; 
        int ctLength = cipher.update(input, 0, input.length, cipherText, 0); 
        ctLength = cipher.doFinal(cipherText, ctLength); 

        return parseByte2HexStr(cipherText); 
    } 

    /**
* Convertir une chaîne en tableau d'octets
* @author lmiky
* @date 2014-2-25
* @param hexString
* @return
*/ 
    byte statique privé[] toByte(String hexString) { 
        int len ​​= hexString.length() / 2; 
        byte[] result = new byte[len]; 
        for (int i = 0; i < len; i ) { 
            result[i] = Integer.valueOf(hexString.substring(2 * i, 2 * i 2), 16).byteValue() ; 
        } 
        renvoyer le résultat ; 
    } 

    /**
* Octet vers tableau hexadécimal
* @author lmiky
* @date 2014-2-25
* @param buf
* @return
*/ 
    private static String parseByte2HexStr(byte buf[]) { 
        StringBuffer sb = new StringBuffer(); 
        for (int i = 0; i < buf.length; i ) { 
            String hex = Integer.toHexString(buf[i] & 0xFF); 
            if (hex.length() == 1) { 
                hex = '0' hex; 
            } 
            sb.append(hex); 
        } 
        return sb.toString(); 
    } 

    public static void main(String[] args) throws Exception { 
        System.out.println(AESForNodejs.encrypt("fsadfsdafsdafsdafsadfsadfsadf", "1234fghjnmlkiuhA")); 
        System.out.println(AESForNodejs.decrypt("5b8e85b7a86ad15a275a7cb61fe4c0606005e8741f68797718a3e90d74b5092a", "1234fghjnmlkiuhA")); 
    } 
}
Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal