2015-01-12 3 views
0

У меня есть два класса с именем encryption.java и decryption.java. Я хочу зашифровать текстовый файл, используя класс encrypt.java, и расшифровать его из класса decrypt.java. Я могу зашифровать текстовый файл успешно, но не смог его расшифровать таким же образом. Может ли кто-нибудь сказать мне, почему нет?Ошибка Java в расшифровке

Это encrypt.java:

public class Encrypt{ 


public static void main(String[] args) throws Exception { 

    String FileName = "D:/ashok/normal.txt"; 
    String FileName1 = "D:/ashok/encrypted.txt"; 


    KeyGenerator KeyGen = KeyGenerator.getInstance("AES"); 
    KeyGen.init(128); 

    SecretKey SecKey = KeyGen.generateKey(); 

    Cipher AesCipher = Cipher.getInstance("AES"); 



    byte[] cipherText = Files.readAllBytes(Paths.get(FileName)); 
    AesCipher.init(Cipher.ENCRYPT_MODE, SecKey); 
    byte[] byteCipherText = AesCipher.doFinal(cipherText); 
    Files.write(Paths.get(FileName1), byteCipherText); 
} 

Это мой decrypt.java класс:

class decrypt{ 
public static void main(String[] args) { 
    try { 
    String FileName1 = "D:/ashok/encrypted.txt"; 
     String FileName2 = "D:/ashok/decrypted.txt"; 

     KeyGenerator KeyGen = KeyGenerator.getInstance("AES"); 
     KeyGen.init(128); 

     SecretKey SecKey = KeyGen.generateKey(); 

     Cipher AesCipher = Cipher.getInstance("AES"); 
     byte[] cipherrText = Files.readAllBytes(Paths.get(FileName1)); 

     AesCipher.init(Cipher.DECRYPT_MODE, SecKey); 
     byte[] bytePlainText = AesCipher.doFinal(cipherrText); 
     Files.write(Paths.get(FileName2), bytePlainText); }} 

и получать ошибки при выполнении класса расшифровывать, как этот

javax.crypto.BadPaddingException: Given final block not properly padded 
    at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:811) 
    at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:676) 
    at com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:313) 
    at javax.crypto.Cipher.doFinal(Cipher.java:2086) 
    at decryption.main(decryption.java:79) 
+0

Пробуйте эту реализацию AES-256 с помощью 'keystore' https://github.com/sufiyanghori/aes-256-java-bks –

ответ

0

Прежде всего, я думаю, что вы должны больше узнать о симметричной криптографии here. Как вы заметили, одной из основных особенностей симметричной криптографии является то, что они тот же ключ используется для шифрования и дешифрования. Напротив, асимметричная криптография (или криптография с открытым ключом link) использует пару ключей: один для шифрования, а другой для дешифрования.

Таким образом, ваша проблема заключается в том, что вы должны сохранить SecretKey SecKey. Например, вы можете сохранить секретный ключ в отдельном файле. Для этого вам понадобится (a) массив байтов (ключ) и (b) алгоритм. Пример того, как сделать это на Encrypt стороне может быть:

 

    String serializedSecKey = new String(Base64.encodeBase64(masterSecretKey.getEncoded())) + ";" + masterSecretKey.getAlgorithm() 
    storeToFile(filename, serializedSecKey); 

Base64.encodeBase64() от org.apache.commons.codec.binary.Base64;. Обратите внимание, что я добавил разделитель между ключом и его алгоритмом , чтобы облегчить разбор.

Затем на вашей стороне Decrypt вы можете проанализировать файл, содержащий информацию о секретном ключе. Пример для восстановления ключа будет:

 

    String serializedSecKey = // obtain the string from the file 
    String [] key = serializedSecKey.split(";"); 
    byte[] keyBytes = Base64.decodeBase64(key[0]); 
    String algorithm = key[1]; 
    SecretKey secKey = new SecretKeySpec(keyBytes, algorithm); 

И полученный secKey сможет расшифровать сообщение.

Наконец, обратите внимание, что это может быть не самый лучший способ для persist секретный ключ. Есть намного лучшие варианты, такие как KeyStores, которые делают все это намного проще.

1

Вы сгенерируйте ключ, используемый для шифрования, используя SecretKey SecKey = KeyGen.generateKey(), что хорошо, но когда вы расшифровываете, вы пытаетесь использовать новый ключ, а не тот, который вы использовали для шифрования текста. Вам нужно сохранить свой ключ, чтобы вы могли его использовать для дешифрования.

+0

Как я могу это сделать, можете ли вы объяснить это с помощью моих кодов, пожалуйста .. –

1

Вам необходимо сохранить это значение SecretKey SecKey = KeyGen.generateKey(); и разделить его между классами шифрования и дешифрования. Итак, в основном вы должны использовать тот же SecKey как для процессов шифрования, так и для дешифрования.

+0

да, я думаю, что я использовал один и тот же secKey в обоих классах правильно? else, можете ли вы, пожалуйста, изменить мои коды с ответом. –

+0

Нет, потому что этот SecretKey SecKey = KeyGen.generateKey(); всегда создает новый SecretKey.См. Это для справки: [ссылка] (http://stackoverflow.com/questions/20796042/aes-encryption-and-decryption-with-java?rq=1) – FrAn

Смежные вопросы