Wie verwenden Sie drei Tasten, mit triple-des(3des) in Java
Fand ich einen link in stackoverflow hier Verwendung-3des-Verschlüsselung-Entschlüsselung-in-java,aber in der Tat die Methode verwendet zwei parameter:HG58YZ3CR9" und die "IvParameterSpec iv = new IvParameterSpec(new byte[8]);
"
Aber die starke Möglichkeit, die triple-des-konnte, drei verschiedene Schlüssel zum verschlüsseln der Nachricht.So, wie das zu tun? Ich finde eine mehond in der Ziffer, die zu verwenden "SecureRandom" als weiteren parameter.Also ist das der richtige Weg?
Die erste Methode code ist unten:
import java.security.MessageDigest;
import java.util.Arrays;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
public class TripleDESTest {
public static void main(String[] args) throws Exception {
String text = "kyle boon";
byte[] codedtext = new TripleDESTest().encrypt(text);
String decodedtext = new TripleDESTest().decrypt(codedtext);
System.out.println(codedtext); //this is a byte array, you'll just see a reference to an array
System.out.println(decodedtext); //This correctly shows "kyle boon"
}
public byte[] encrypt(String message) throws Exception {
final MessageDigest md = MessageDigest.getInstance("SHA-1");
final byte[] digestOfPassword = md.digest("HG58YZ3CR9"
.getBytes("utf-8"));
final byte[] keyBytes = Arrays.copyOf(digestOfPassword, 24);
for (int j = 0, k = 16; j < 8;) {
keyBytes[k++] = keyBytes[j++];
}
final SecretKey key = new SecretKeySpec(keyBytes, "DESede");
final IvParameterSpec iv = new IvParameterSpec(new byte[8]);
final Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key, iv);
final byte[] plainTextBytes = message.getBytes("utf-8");
final byte[] cipherText = cipher.doFinal(plainTextBytes);
//final String encodedCipherText = new sun.misc.BASE64Encoder()
//.encode(cipherText);
return cipherText;
}
public String decrypt(byte[] message) throws Exception {
final MessageDigest md = MessageDigest.getInstance("SHA-1");
final byte[] digestOfPassword = md.digest("HG58YZ3CR9"
.getBytes("utf-8"));
final byte[] keyBytes = Arrays.copyOf(digestOfPassword, 24);
for (int j = 0, k = 16; j < 8;) {
keyBytes[k++] = keyBytes[j++];
}
final SecretKey key = new SecretKeySpec(keyBytes, "DESede");
final IvParameterSpec iv = new IvParameterSpec(new byte[8]);
final Cipher decipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");
decipher.init(Cipher.DECRYPT_MODE, key, iv);
//final byte[] encData = new
//sun.misc.BASE64Decoder().decodeBuffer(message);
final byte[] plainText = decipher.doFinal(message);
return new String(plainText, "UTF-8");
}
}
- Brauchen Sie, um inter-Betrieb mit einigen vorhandenen code? Wenn nicht, warum verwenden Sie 3DES anstelle von AES?
- Der server verwendet 3des seit vielen Jahren und unsere manager nicht wollen, ändern Sie den Algorithmus der server
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als pro dieses Dokument, übergeben Sie einfach die Chiffre einem Schlüssel von 168 bit lang sind.
Dein code scheint etwas fraglich zu machen für die Tatsache, dass die Ausgabe des MD5 nur 128 bit lang.
Kopieren-einfügen von kryptographischen code aus dem internet liefern keine sicheren Anwendungen. Die Verwendung einer statischen IV Kompromisse mehrere Gründe, warum CBC-Modus ist besser als die EZB. Wenn Sie mit einem statischen Schlüssel, Sie sollten wahrscheinlich betrachten Erzeugung von Zufallszahlen bytes mit einem secure random number generator statt der Ableitung der Schlüssel aus einem kurzen ASCII-string. Auch gibt es absolut keinen Grund für die Verwendung von Triple-DES statt AES in neuen Anwendungen.
Grundsätzlich der for-next-Schleife zu erzeugen, die DES ABA-Schlüssel ist richtig. Beachten Sie, dass Sie können DESede mit einem 16-byte-Schlüssel von Java 7 ab, was auf das gleiche hinausläuft.
Sagte, die code, den Sie gezeigt haben, lässt einiges zu wünschen übrig:
Ich nicht sicher:
Darüber hinaus die folgenden code-Fehler können gesehen werden:
new sun.misc.BASE64Encoder()
die in der Sonne proprietäre Pakete (die entfernt werden können oder geändert werden, die während jeder Aktualisierung der runtime)Exception
für Plattform-exceptions und runtime-exceptions (die nicht in der Lage zu entschlüsseln, wird auf die gleiche Weise behandelt wie die nicht in der Lage zu instanziierenCipher
)Arrays.copyOf()
nennen (das scheint die Rückkehr 24 SHA-1 Ausgang, während es nur 20 bytes)Erzeugen eine 3DES-24 byte (168 bits) DES ABC-Schlüssel aus einem Kennwort (wie) Zeichenfolge, die Sie verwenden sollten, PBKDF-2. Hinzufügen eines authentication-tag ist auch sehr wichtig, wenn man-in-the-middle-Angriffe oder padding oracle gelten. Es wäre viel sicherer und viel mehr praktische upgrade auf AES, wenn Sie können Steuern, die algorithmen, die verwendet wird als gut.