Algorithme de hachage Java Cryptonight-longueur de clé AES étendue?
Je travaille sur une application de mineur de crypto-monnaie Java basée sur un algorithme cryptonight.
J'essaie d'implémenter la fonction de hachage basée sur ce document: https://cryptonote.org/cns/cns008.txt
Mon code:
public byte[] mine(String hash) {
byte[] out = hash.getBytes();
out = doKeccak(out);
//Make key
byte[] key = new byte[32];
System.arraycopy(out, 0, key, 0, 32);
//Make blocks
byte[][] blocks = new byte[8][];
for (int i = 0; i < 8; ++i)
System.arraycopy(out, 64 + 16 * i, blocks[i], 0, 16);
byte[][] keys = new byte[11][];
keys[0]=key;
for (int i = 0; i < 10; ++i) {
keys[i+1]=new byte[32];
Rijndael.expandKey(keys[i], keys[i+1], 0, 32, 32);
}
//byte[] pad = new byte[2097152];
//Encrypt blocks
for (int bid = 0; bid < 8; ++bid) {
for (int i = 0; i < 10; ++i) {
blocks[bid] = AES.encrypt(blocks[i], keys[i+1]);
}
}
return Utils.byteToHex(out);
}
L'utilisation de la Rijndael.expandKey
méthode ressemble à ça: public static void expandKey(byte[] key, byte[] out, int offset, int keySize, int expKeySize)
Quel numéro dois-je entrer dans la taille de clé étendue? Je ne peux pas voir cela dans la documentation, c'est pourquoi je le demande ici.
1 answers
Cryptonight utilise l'algorithme AES modifié. Dans l'algorithme standard, vous développez la clé de 256 bits en 15 clés de 128 bits chacune. Pour cryptonight, vous n'avez besoin que de 10 clés de 128 bits chacune. La longueur de sortie doit donc être de 1280 bits ou 160 octets
Le bon article qui explique la planification des clés avec des exemples de code Java (inclure le cas pour l'algorithme AES modifié Cryptonight):
Http://cryptoexplained.tech/hash-algorithmes aes-clé-annexe
Et le code source: