AES-Verschlüsselung/Entschlüsselung java Hüpfburg Erklärung?
Kann mir bitte jemand erklären, was dieses Programm tut, zeigen einige der wichtigsten Punkte? Ich freue mich auf den code, und ich bin völlig verloren. Ich brauche nur Erklärung auf die Verschlüsselung/Entschlüsselung Phasen. Ich denke, es generiert einen AES-192-Schlüssel an einem Punkt aber bin ich mir nicht 100% sicher. Ich bin mir nicht sicher, was der byte - /ivBytes verwendet werden entweder.
import java.security.Key;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.spec.IvParameterSpec;
public class RandomKey
{
public static void main(String[] args) throws Exception
{
byte[] input = new byte[] {
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 };
byte[] ivBytes = new byte[] {
0x00, 0x00, 0x00, 0x01, 0x04, 0x05, 0x06, 0x07,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 };
//initializing a new initialization vector
IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);
//what does this actually do?
Cipher cipher = Cipher.getInstance("AES/CTR/NoPadding", "BC");
//what does this do?
KeyGenerator generator = KeyGenerator.getInstance("AES","BC");
//I assume this generates a key size of 192 bits
generator.init(192);
//does this generate a random key?
Key encryptKey = generator.generateKey();
System.out.println("input: " +toHex(input));
//encryption phase
cipher.init(Cipher.ENCRYPT_MODE, encryptKey, ivSpec);
//what is this doing?
byte[] cipherText = new byte[cipher.getOutputSize(input.length)];
//what is this doing?
int ctLength = cipher.update(input, 0, input.length, cipherText,0);
//getting the cipher text length i assume?
ctLength += cipher.doFinal (cipherText, ctLength );
System.out.println ("Cipher: " +toHex(cipherText) + " bytes: " + ctLength);
//decryption phase
cipher.init(Cipher.DECRYPT_MODE, encryptKey, ivSpec);
//storing the ciphertext in plaintext i'm assuming?
byte[] plainText = new byte[cipher.getOutputSize(ctLength)];
int ptLength = cipher.update(cipherText, 0, ctLength, plainText, 0);
//getting plaintextLength i think?
ptLength= cipher.doFinal (plainText, ptLength);
System.out.println("plain: " + toHex(plainText, ptLength));
}
private static String digits = "0123456789abcdef";
public static String toHex(byte[] data, int length)
{
StringBuffer buf = new StringBuffer();
for (int i=0; i!= length; i++)
{
int v = data[i] & 0xff;
buf.append(digits.charAt(v >>4));
buf.append(digits.charAt(v & 0xf));
}
return buf.toString();
}
public static String toHex(byte[] data)
{
return toHex(data, data.length);
}
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese nutzt die Bouncy Castle ("BC") - Anbieter, um eine Instanz der AES cypher", das im Counter-mode (CTR) mit keine Polsterung (NoPadding). Siehe Wikipedia für Block-Cypher-Modi und Polsterung. Die Javadoc wird auch Ihnen helfen.
Wieder diese nutzt die Bouncy Castle provider eingerichtet, ein Schlüssel-generator für die AES. Lesen Sie in der Javadoc-um mehr zu erfahren.
Es wird ein Byte-array groß genug ist, um die verschlüsselte Ausgabe.
Es ist eigentlich die encyphering. Überprüfen Sie die Javadoc für die
update()
Methode für eine gute Erklärung.Nicht. Schau, dass
+=
Es ist Aktualisierung der cyphertext Länge. Wieder Lesen Sie die Javadoc für die Unterschiede zwischen denupdate()
unddoFinal()
Methoden.Haben Sie versucht, auf der Suche hier?
http://docs.oracle.com/javase/6/docs/api/javax/crypto/Cipher.html
http://docs.oracle.com/javase/6/docs/api/javax/crypto/KeyGenerator.html
Den code, den Sie haben, ist ein ziemlich geradlinig-code-Beispiel zum verschlüsseln und entschlüsseln byte-Daten in Java.
Sobald Sie Sie gelesen haben, über die Klassen-Dokumentation können Sie besser artikulieren, Ihre Fragen über das Verhalten von diesem code.