2017-11-30 1 views
-1

Das ist mein Java-Programm:Java dekodieren AES verschlüsselte Nachricht Ausgabe

package com.util; 

import java.security.InvalidAlgorithmParameterException; 
import java.security.InvalidKeyException; 
import java.security.NoSuchAlgorithmException; 
import java.security.SecureRandom; 
import java.util.Base64; 

import javax.crypto.BadPaddingException; 
import javax.crypto.Cipher; 
import javax.crypto.IllegalBlockSizeException; 
import javax.crypto.KeyGenerator; 
import javax.crypto.NoSuchPaddingException; 
import javax.crypto.SecretKey; 
import javax.crypto.spec.IvParameterSpec; 

public class Coder1 { 

    public static int AES_KEY_SIZE = 256 ; 
    public static int IV_SIZE = 16 ; 
    public static void main(String[] args) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, InvalidAlgorithmParameterException 
    { 
     String message = "abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; 
     message =message +message; 
     message =message +message; 
     KeyGenerator keygen = KeyGenerator.getInstance("AES") ; // Specifying algorithm key will be used for 
     keygen.init(AES_KEY_SIZE) ; // Specifying Key size to be used, Note: This would need JCE Unlimited Strength to be installed explicitly 
     SecretKey aesKey = keygen.generateKey(); 

     // Generating IV 
     byte iv[] = new byte[IV_SIZE]; 

     SecureRandom secRandom = new SecureRandom() ; 
     secRandom.nextBytes(iv); 
     Cipher cipher = Cipher.getInstance("AES/CTR/PKCS5PADDING"); 
     Cipher decipher = Cipher.getInstance("AES/CTR/PKCS5PADDING"); 
     cipher.init(Cipher.ENCRYPT_MODE, aesKey,new IvParameterSpec(iv)); 
     decipher.init(Cipher.DECRYPT_MODE, aesKey,new IvParameterSpec(iv)); 
     byte[] cipherTextInByteArr = cipher.doFinal(message.getBytes()); 
     byte[] plainTextInByteArr = decipher.doFinal(cipherTextInByteArr); 
     System.out.println("Key="+Base64.getEncoder().encodeToString(aesKey.getEncoded())+"|"); 
     System.out.println("IV="+Base64.getEncoder().encodeToString(iv)+"|"); 
     System.out.println("Encrypted Text=" + Base64.getEncoder().encodeToString(cipherTextInByteArr)+"|") ; 
     System.out.println("Decrypted text=" + new String(plainTextInByteArr)); 
    } 

} 

Um die Ausgabe des obigen Java-Programm zu entschlüsseln, die JavaScript-Bibliothek sollte ich verwenden? Ich möchte einen sicheren Websocket-Kanal einrichten. Ich habe versucht, RSA-Algorithmus zu verwenden. Leider unterstützt es nicht die Nachrichtengröße größer als 128 Byte.

Ich folge dem Beispiel in here. Es funktioniert gut in Java-Seite, aber ich weiß nicht, wie SealedObject zu Javascript-Seite, daher, Sackgasse wieder zu senden.

Die Java-Programm Ausgabe wie folgt:

Key=hlnUjh4GM1PegSzl13YFQgI5+I1qcbsmqlBV8vDsVy0=| 
IV=ZkqiRuDS7YUrjZMLRr/gfQ==| 
Encrypted Text=HFROj40Qh9YagJAS+7saN2/ugqszCPpmjT9Qwy2yt9dCntSbpbYqTt/tW0ju5QO614+S9zQyOdBXFKtNdDew9Ouo9YkmRgRkjY7NNGyVbt+Z5CYCgcwpRmNUuH7Fqyat5H3hFSUi05UyLLA6lIa47wyP7jKsq0rtj1yHth8qN06aisB18s4Cf9YBPbUM72qXS+IcpKLMWEVVw7Q0qA91WRCt9y93SptNUme75D/qCKyym20UJ5f0ZCgijOnnsbWJKci1R179qZ8UthFBjqcZm88VmV1UuA7OsAvzxsyA7iVtwsf9u6UnrlOtoMTl41Q5nLod4unkdbomrXb6hDKhV9ThtCy1ZWPFHhKbEAPMdzUnmmBSwcuGSTKvdPJeHAWH| 
Decrypted text=abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890 

nach der Post here, die Crypto-JS kann die Java-Ausgabe erfolgreich dekodieren.

Allerdings kann das Java-Programm die Javascript-Ausgabe nicht erfolgreich dekodieren. Hier ist mein Javascript progarm

<script src="js/cryptojs/rollups/aes.js"></script> 
    <script src="js/cryptojs/components/mode-ctr-min.js"></script> 
    <script language=javascript> 
      .................. 
     var result; 
     var encoded=CryptoJS.AES.encrypt("hello", 
             keyArray, 
             { 
             iv: ivArray, 
             mode: CryptoJS.mode.CTR, 
             padding: CryptoJS.pad.Pkcs7 
             }); 

     result=encoded.ciphertext.toString(CryptoJS.enc.Base64); 
    </script> 

Mein Java-Programm:

byte iv[] = new byte[16]; 
    SecureRandom secRandom = new SecureRandom() ; 
    secRandom.nextBytes(iv);  
    Cipher decipher = Cipher.getInstance("AES/CTR/PKCS5PADDING"); 
    decipher.init(Cipher.DECRYPT_MODE, aesKey,new IvParameterSpec(iv)); 
    byte[] cipherTextInByteArr =Base64.getDecoder().decode(encodedText); 
    byte[] plainTextInByteArr = decipher.doFinal(cipherTextInByteArr);  
    String result=new String(plainTextInByteArr,"UTF-8"); 

jedoch der Ausgang "Hallo ???????". Ist etwas nicht in Ordnung?

+0

RSA nicht verwendet wird, eine ganze Nachricht zu verschlüsseln, aber einen Schlüssel für einen anderen Verschlüsselungsalgorithmus (in der Regel symmetrisch zu verschlüsseln), die zum Verschlüsseln der Nachricht verwendet wird. –

+0

Obwohl Sie möglicherweise Java verwenden, um die Nachricht zu verschlüsseln, stellen Sie in Wirklichkeit JavaScript in Frage. Daher ist das Tag [tag: java] hier nicht geeignet. –

+0

Auch Fragen, die uns bitten, ein Buch, ein Tool, eine Softwarebibliothek, ein Tutorial oder eine andere Offsite-Ressource zu empfehlen oder zu finden, sind für Stack Overflow off-topic, da sie dazu neigen, Meinungen und Spam anzusprechen. Stattdessen [beschreibe das Problem] (http://meta.stackoverflow.com/questions/254393) und was bisher getan wurde, um es zu lösen. –

Antwort

0

Schließlich bekomme ich es funktioniert. Gemäß this post erfordert der CTR-Modus kein Auffüllen. Deshalb ist die Javascript-Programm wie folgt aussehen:

<script src="js/cryptojs/rollups/aes.js"></script> 
<script src="js/cryptojs/components/mode-ctr-min.js"></script> 
<script language=javascript> 
     .................. 
    var result; 
    var encoded=CryptoJS.AES.encrypt("hello", 
            keyArray, 
            { 
            iv: ivArray, 
            mode: CryptoJS.mode.CTR, 
            padding: CryptoJS.pad.NoPadding 
            }); 

    result=encoded.ciphertext.toString(CryptoJS.enc.Base64); 
</script> 

Und das Java-Programm wie folgt aussehen:

byte iv[] = new byte[16]; 
SecureRandom secRandom = new SecureRandom() ; 
secRandom.nextBytes(iv);  
Cipher decipher = Cipher.getInstance("AES/CTR/NoPadding"); 
decipher.init(Cipher.DECRYPT_MODE, aesKey,new IvParameterSpec(iv)); 
byte[] cipherTextInByteArr =Base64.getDecoder().decode(encodedText); 
byte[] plainTextInByteArr = decipher.doFinal(cipherTextInByteArr);  
String result=new String(plainTextInByteArr,"UTF-8"); 
Verwandte Themen