2013-03-21 7 views
11

Das Projekt, an dem ich arbeite, hat ein Segment, das AES-Verschlüsselung und -Entschlüsselung erfordert. Von allen möglichen Internetquellen, die ich nachschlagen konnte, war es schwierig, einen Hinweis auf die AES256-Verschlüsselung zu finden, ohne die Unlimited Strength JCE-Dateien von Sun (jetzt die Oracle-Website) herunterladen und installieren zu müssen. Abgesehen von den rechtlichen Problemen, die bei der Verteilung derselben auftreten, hilft es uns nicht sehr praktisch, wenn ein Endnutzer eine bestimmte Website besuchen und einige Dateien herunterladen, in ein Verzeichnis stellen und dann Dinge zum Klassenpfad hinzufügen soll auf Windows usw.!Ist die Entschlüsselung der AES256-Verschlüsselung in Java ohne unbegrenzt starke JCE-Dateien möglich?

Es gab einige Referenzen im Internet zu BountyCastle's leichtgewichtiger API, die möglicherweise die JCE-Dateien nicht benötigten, aber ich konnte keine sehr relevante Referenz oder ein Beispiel nachschlagen, das sie demonstrierte.

Nicht sicher, aber ist das ein Problem mit jeder anderen Programmiersprache?

Wenn es nicht möglich ist, eine AES-256-Bit-Verschlüsselung zu verwenden, ohne dass diese speziellen JCE-Dateien installiert sind, kann der JNI-Ansatz helfen?

ein bisschen zu erarbeiten, 256-Verschlüsselung in C/C++ und dann erfolgen AES kann, kann ich die Verwendung von JNI aufrufen, um die gewünschten Ergebnisse zu haben? Ist die Verpackung der Software (als JAR-Datei) ein Grund zur Besorgnis oder können andere Probleme auftreten?

Ein weiterer wichtiger Faktor, der ins Spiel kommt, ist, dass das Projekt sowohl von Mac als auch von Windows ausgeführt wird, also können Einschränkungen bei der Verwendung von C/C++ (spezifische Compiler/Interpreter-Versionen oder irgendetwas) sein?

Gibt es einen anderen Weg, damit umzugehen? Irgendwelche anderen Ansätze?

+2

Willkommen bei [SO]. Ich habe mir die Freiheit genommen, etwas Text zu entfernen, der nicht wirklich notwendig war. Wir mögen unsere Fragen kurz und dieser ist schon lange ohne diesen Text ;-) –

+2

Ich denke, dass Sie eine Java AES Implementierung hier finden können: https://jce.iaik.tugraz.at/ aber ich denke es ist nur kostenlos für Forschung/Studenten. – HectorLector

+0

Vergessen Sie nicht, die Antworten zu aktualisieren oder zu akzeptieren, Norah ... –

Antwort

5

Zunächst einmal nein, es ist kein Problem, mit jeder Programmierumgebung. OpenSSL, das in C geschrieben ist, unterstützt beispielsweise große Schlüssel. Aus der Erfahrung mit sowohl JCE und JNI würde ich jedoch vorschlagen, dass Sie einen Weg finden, reine Java zu verwenden, anstatt eine native Bibliothek durch JNI des Ladens. Es ist einfach viel einfacher.

Eine praktische Lösung: Wird Ihre Anwendung während der Installation mit einer Art Installationsprogramm installiert? Wenn dies der Fall ist, könnte es eine Lösung sein, dieses Installationsprogramm auch zum Installieren von JCE zu verwenden.

BouncyCastle leider nutzt auch JCE wie in ihrer FAQ angegeben.

UPDATE 1: Ich habe diese Bibliothek gefunden, die möglicherweise das ist, was Sie suchen. Es scheint nicht mehr jedoch beibehalten werden: http://www.cryptix.org/

UPDATE 2: GNU verfügt über eine Bibliothek, die AES256 implementiert: http://www.gnu.org/software/gnu-crypto/.Mehr zu den verfügbaren Chiffren hier: http://www.gnu.org/software/gnu-crypto/manual/Ciphers.html

Codebeispiel mit GNU-Crypto gegeben, dass Sie bereits Ihren Schlüssel in key_bytes geladen haben:

IBlockCipher cipher = CipherFactory.getInstance("AES"); 
Map attributes = new HashMap(); 
attributes.put(IBlockCipher.CIPHER_BLOCK_SIZE, new Integer(16)); 
attributes.put(IBlockCipher.KEY_MATERIAL, key_bytes); 
cipher.init(attributes); 
int bs = cipher.currentBlockSize(); 

for (int i = 0; i + bs < pt.length; i += bs) 
{ 
    cipher.encryptBlock(pt, i, ct, i); 
} 

for (int i = 0; i + bs < cpt.length; i += bs) 
{ 
    cipher.decryptBlock(ct, i, cpt, i); 
} 

Bitte versichern, dass Sie einen kryptografisch sicheren Zufallszahlengenerator verwenden wie SecureRandom erstellen Sie Ihr 256 Bytes für den Schlüssel:

byte[] seed = xxx; // Be sure to get a good new seed on every client machine. 
SecureRandom random = new SecureRandom(seed); 
byte[] key_bytes = new byte[256]; 
random.nextBytes(key_bytes); 
+4

Die Bouncycastle Lightweight-API verwendet * nicht * das JCE und unterliegt daher nicht der Notwendigkeit für Krypto-Dateien mit unbegrenzter Zuständigkeit. –

+0

@GregS verwendet dies als Basis für eine Antwort –

+0

Hinweis auf eine nicht gepflegte Crypto-Bibliothek sollte normalerweise in einer -1 enden, aber ich lasse es sein, wie die anderen Informationen korrekt sind. –

6

die Schlüsselgröße Einschränkungen sind in der Cipher Klasse von Java implementiert. Es ist möglich, eine beliebige andere Klasse zu verwenden, die AES implementiert, um AES-256-Funktionalität zu erhalten. Zum Beispiel ist es möglich, die "leichte" API von Bouncy Castle zu verwenden, um Schlüsselgrößen beliebiger Stärke zu verwenden. In diesem Fall können Sie z.B. verwenden org.bouncycastle.crypto.engines.AESFastEngine direkt (und ein mode und padding Ihrer Wahl. Es ist immer noch möglich, die normale .jar für Bouncy Castle zu verwenden, aber Sie werden nicht die JCA Funktionalität des BouncyCastle Anbieter werden.

Dies hat einige Nachteile Die leichtgewichtige Bouncy Castle API ist etwas niedriger als die JCA-Funktionalität, die der Sun-Klasse vom "BC"-Anbieter hinzugefügt wurde.Zudem werden viele Komponenten (wie die SSL-Schicht in Java, JSSE oder die XML-Verschlüsselungsbibliotheken) verwendet die JCA die erforderliche Verschlüsselungsfunktionalität. die Bibliotheken zu liefern, die JCA-Funktionalität erfordert noch beschränkt Schlüsselgrößen begrenzt werden.

N Anmerkung: Die Verwendung anderer Provider funktioniert nicht, da die Klasse Cipher selbst nach der Schlüsselgröße sucht. Die CipherSpi Implementierungsklassen, die in einem JCA-Provider enthalten sein können, können die zulässigen Schlüsselgrößen nicht (positiv) beeinflussen. Sie können die Implementierungsklassen nur direkt verwenden.

+0

[link] (http://www.bouncycastle.org/documentation.html) geholfen – Norah

Verwandte Themen