javax.crypto.IllegalBlockSizeException: Eingabe der Länge kein Vielfaches von 8 bytes
ich bin immer diese Fehler während der Entschlüsselung habe ich gehen durch die ähnliche Beiträge, aber ich bekam keine Hilfe von dort. Ich speichern möchten ein Objekt direkt in eine Datei-Verschlüsselung für die, die ich gepostet meine Frage hier. Aber beim stream erhalte ich den gleichen Fehler wie ich immer bin, mit string.
package security;
import java.security.spec.KeySpec;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
/**
* This class defines methods for encrypting and decrypting using the Triple DES
* algorithm and for generating, reading and writing Triple DES keys. It also
* defines a main() method that allows these methods to be used from the command
* line.
*/
public class TripleDesEncryptionDecryption {
/**
* The program. The first argument must be -e, -d, or -g to encrypt,
* decrypt, or generate a key. The second argument is the name of a file
* from which the key is read or to which it is written for -g. The -e and
* -d arguments cause the program to read from standard input and encrypt or
* decrypt to standard output.
*/
private static final String UNICODE_FORMAT = "UTF-8";
public static final String DESEDE_ENCRYPTION_SCHEME = "DESede";
private KeySpec myKeySpec;
private SecretKeyFactory mySecretKeyFactory;
private Cipher cipher;
byte[] keyAsBytes;
private String myEncryptionKey;
private String myEncryptionScheme;
SecretKey key;
static String stringToEncrypt="";
public void setKey(String myKey) throws Exception
{
myEncryptionKey = myKey ;
myEncryptionScheme = DESEDE_ENCRYPTION_SCHEME;
keyAsBytes = myEncryptionKey.getBytes(UNICODE_FORMAT);
myKeySpec = new DESedeKeySpec(keyAsBytes);
mySecretKeyFactory = SecretKeyFactory.getInstance(myEncryptionScheme);
cipher = Cipher.getInstance("DESede/ECB/NoPadding");
key = mySecretKeyFactory.generateSecret(myKeySpec);
}
/**
* Method To Encrypt The String
*/
public String encrypt(byte[] plainText) {
String encryptedString = null;
try {
cipher.init(Cipher.ENCRYPT_MODE, key);
//byte[] plainText = unencryptedString.getBytes(UNICODE_FORMAT);
//byte[] encryptedText = cipher.doFinal(plainText);
BASE64Encoder base64encoder = new BASE64Encoder();
encryptedString = base64encoder.encode(plainText);
} catch (Exception e) {
e.printStackTrace();
}
return encryptedString;
}
/**
* Method To Decrypt An Ecrypted String
*/
public String decrypt(String encryptedString) {
String decryptedText=null;
try {
cipher.init(Cipher.DECRYPT_MODE, key);
BASE64Decoder base64decoder = new BASE64Decoder();
System.out.println(myEncryptionKey);
byte[] encryptedText = base64decoder.decodeBuffer(encryptedString);
byte[] plainText = cipher.doFinal(encryptedText);
decryptedText= bytes2String(plainText);
} catch (Exception e) {
e.printStackTrace();
}
return decryptedText;
}
/**
* Returns String From An Array Of Bytes
*/
private static String bytes2String(byte[] bytes) {
StringBuffer stringBuffer = new StringBuffer();
for (int i = 0; i < bytes.length; i++) {
stringBuffer.append((char) bytes[i]);
}
return stringBuffer.toString();
}
/**
* Testing The DESede Encryption And Decryption Technique
*/
public static void main(String args []) throws Exception
{
TripleDesEncryptionDecryption myEncryptor= new TripleDesEncryptionDecryption();
myEncryptor.setKey("[email protected]") ;
System.out.println("tarun1234".getBytes());
String encrypted=myEncryptor.encrypt("tarun".getBytes());
String decrypted=myEncryptor.decrypt(encrypted);
System.out.println("String To Encrypt: "+stringToEncrypt);
System.out.println("Encrypted Value :" + encrypted);
System.out.println("Decrypted Value :"+decrypted);
}
}
InformationsquelleAutor tarun verma | 2014-08-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich nicht genau weiß, was Sie erreichen wollen, aber ich kann zumindest erklären, die Fehler, die Sie bekommen.
DES und 3DES haben eine block-Länge von
64 bit
. Das bedeutet, dass müssen Sie passieren eine Klartext, die Länge ist ein Vielfaches von 64-bit an die Verschlüsselungs-Funktion. Um dies zu erreichen Sie in der Regel pad /füllen, bis der Letzte block des klartexts mit Daten von einem bestimmten Muster, so dass Sie leicht entfernen Sie es wieder nach der Entschlüsselung.In Ihrem code, den Sie geben Sie die Verschlüsselungs-Parameter wie folgt:
DESede/ECB/NoPadding
So dass Sie sich explizit nicht automatisch gelten keine Polsterung.
Um dies zu beheben, geben Sie einfach ein padding-Modus (zum Beispiel
PKCS5Padding
) stattNoPadding
.Hinweis: Die cipher-Modus
ECB
ist nicht sicher! Stattdessen sollten Sie besser nutzen:(Sie müssen eine zusätzliche
IV
wenn Sie allerdings einen Modus wieCBC
oderCTR
)DES
ist in der Tat zu schwach, aberDESede
ist Java (oder JCA) name für das, was die meisten Leute nennen Triple-DES und wird immer noch verwendet, zu sichern mit dem vollen 192-wirklich-168-bit-Schlüssel;AES
unterstützt die 128 -, 192-oder 256-bit-Schlüssel, wenn Sie die "unlimited strength policy" mod, finden Sie unter Oracle-website. CBC ist gut für die meisten Fälle, aber Sie müssen ändern Sie den code der IV. Und JCA verwendet die SchreibweisePKCS5Padding
obwohl es eigentlich implementiert die PKCS7-enhancement, d.h. blocksize 16 sowie 8.Vielen Dank für den Hinweis auf meine Fehler. Ich aktualisiert meine Antwort mit den Informationen.
InformationsquelleAutor i_turo