Recherche d'un moyen de crypter des données (principalement des chaînes) dans un nœud et de les décrypter dans une application Android (java).
Je l'ai fait avec succès dans chacun d'entre eux (chiffrer / déchiffrer dans le nœud et chiffrer / déchiffrer en java) mais n'arrive pas à le faire fonctionner entre eux.
Peut-être que je ne crypte / décrypte pas de la même manière, mais chaque bibliothèque dans chaque langue a des noms différents pour les mêmes choses ...
Toute aide appréciée.
voici du code: Node.js
var crypto = require('crypto')
var cipher = crypto.createCipher('aes-128-cbc','somepass')
var text = "uncle had a little farm"
var crypted = cipher.update(text,'utf8','hex')
crypted += cipher.final('hex')
//now crypted contains the hex representation of the ciphertext
et java
private static String decrypt(byte[] raw, byte[] encrypted) throws Exception {
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, skeySpec );
byte[] decrypted = cipher.doFinal(encrypted);
return new String(decrypted);
}
la clé brute est créée comme ceci
private static byte[] getRawKey(String seed) throws Exception {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
byte[] seedBytes = seed.getBytes()
sr.setSeed(seedBytes);
kgen.init(128, sr); // 192 and 256 bits may not be available
SecretKey skey = kgen.generateKey();
byte[] raw = skey.getEncoded();
return raw;
}
tandis que la chaîne hexadécimale chiffrée est convertie en octets comme celui-ci
public static byte[] 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();
return result;
}
Apparemment, si vous lui passez une phrase de passe, crypto.createCipher()
il utilise OpenSSL EVP_BytesToKey()
pour dériver la clé. Vous pouvez passer un tampon d'octets brut et l'utiliser pour initialiser Java SecretKey
, ou émuler EVP_BytesToKey()
dans votre code Java. Utilisez $ man EVP_BytesToKey
pour plus de détails, mais essentiellement, il hache la phrase secrète plusieurs fois avec MD5 et concatène un sel.
Quant à l'utilisation d'une clé brute, quelque chose comme ceci devrait vous permettre d'utiliser une clé brute:
var c = crypto.createCipheriv("aes-128-ecb", new Buffer("00010203050607080a0b0c0d0f101112", "hex").toString("binary"), "");
Notez que puisque vous utilisez CBC, vous devez utiliser le même IV pour le cryptage et le décryptage (vous voudrez peut-être l'ajouter à votre message, etc.)
Avertissement obligatoire: implémenter vous-même un protocole cryptographique est rarement une bonne idée. Même si cela fonctionne, allez-vous utiliser la même clé pour tous les messages? Pour combien de temps? Si vous décidez de faire tourner la clé, comment gérer cela. Etc.
Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.
En cas d'infraction, veuillez [email protected] Supprimer.
laisse moi dire quelques mots