Ich arbeite an einem Projekt, das 3DES-Verschlüsselung in Java erfordert. Das Problem ist, dass ich mit einem 128-Bit Hex-Schlüssel wie "ABCDEFABCDEF" ausgeliefert wurde (und dies auch weiterhin tun werde). Die Konvertierung in Bytes ist kein Problem. Was ist das Problem ist jedoch, dass die Java Cryptographic Extensions API auf diesen Schlüssel ersticken wird, sagen, dass es ungültig ist. Ich nehme an, dass das MSB jedes Bytes nur ein Paritätsbit ist, also erwartet die JCE, dass ich diese entferne (oder so denke ich). In .NET kann ich jedoch den Schlüssel als geliefert angeben, und es behandelt ruhig die Verschlüsselung/Entschlüsselung ohne Beschwerden.3DES/DES-Verschlüsselung mit dem JCE - Generierung eines akzeptablen Schlüssels
Gibt es eine Möglichkeit, wie ich die Art von Schlüssel generieren kann, den die JCE von der Art des Schlüssels erwartet, den ich bekomme?
Ich habe festgestellt, dass die JCE ermöglicht Ihnen, einen 8-Byte-Schlüssel für DES-Verschlüsselung anzugeben, also habe ich versucht, 3DES als DES EDE mit der Hälfte des mitgelieferten Schlüssels zu implementieren. Ich bekomme jedoch immer noch inkonsistente Ergebnisse mit .NET.
Hier ist der Java-Code:
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import javax.crypto.spec.IvParameterSpec;
public class Main{
public static void main(String[] args) throws Exception {
byte [] plain = "I eat fish every day".getBytes("utf-8");
byte [] keyBytes = new byte [] { (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00
};
byte [] key2Bytes = new byte [] { (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x0 }; // actual keys replaced with dummies.
SecretKey keySpec = new SecretKeySpec(keyBytes, "DES");
SecretKey keySpec2 = new SecretKeySpec(key2Bytes, "DES");
IvParameterSpec iv = new IvParameterSpec(new byte[8]);
Cipher e_cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
Cipher cipher = Cipher.getInstance("DES/CBC/NoPadding");
e_cipher.init(Cipher.ENCRYPT_MODE, keySpec, iv);
cipher.init(Cipher.DECRYPT_MODE, keySpec2, iv);
byte [] cipherText = e_cipher.doFinal(plain);
cipherText = cipher.doFinal(cipherText);
cipherText = e_cipher.doFinal(cipherText);
System.out.println("Ciphertext: " + new sun.misc.BASE64Encoder().encode(cipherText));
}
}
und hier ist die .NET-Code:
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
namespace EncryptionDemo
{
class Program
{
public static void Main(string[] args)
{
Console.WriteLine("Hello World!");
// TODO: Implement Functionality Here
var plainBytes = Encoding.UTF8.GetBytes("I eat fish every day");
var keyBytes = new byte [] { 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00 };
var tripleDES = TripleDESCryptoServiceProvider.Create();
var transform = tripleDES.CreateEncryptor(keyBytes, new byte [8]);
var memStream = new MemoryStream();
var cStream = new CryptoStream(memStream, transform, CryptoStreamMode.Write);
cStream.Write(plainBytes, 0, plainBytes.Length);
cStream.FlushFinalBlock();
//memStream.Position = 0;
var cipherBytes = memStream.ToArray();
Console.WriteLine("Ciphertext: " + Convert.ToBase64String(cipherBytes));
Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
}
}
Beide unterschiedliche Ausgangssignale erzeugen (einige Zeichen in der Base64-String sind gleich)
"Choke" ist wirklich vage. Wie wäre es mit einer tatsächlichen Fehlermeldung? – erickson
@erickson: Entschuldigung. schauen Sie bitte unter Exception in thread "main" java.security.InvalidKeyException: Ungültige Schlüssellänge: 16 Byte bei com.sun.crypto.provider.DESedeCipher.engineGetKeySize (DashoA13 * ..) \t bei javax.crypto.Cipher. b (DashoA13 * ..) \t bei javax.crypto.Cipher.a (DashoA13 * ..) \t bei javax.crypto.Cipher.a (DashoA13 * ..) \t bei javax.crypto.Cipher.a (DashoA13 * ..) \t bei javax.crypto.Cipher.init (DashoA13 * ..) \t bei javax.crypto.Cipher.init (DashoA13 * ..) \t bei Main.main (Main.java:30) – darkphoenix
Zur Kontextklärung, die Frage kommt aus der jpos Mailing-Liste https://groups.google. com/forum/#! msg/jpos-users/sfXGf2gwQhY/xN63ze305bwJ – bbozo