Проблемы с шифрованием AES - PullRequest
       32

Проблемы с шифрованием AES

0 голосов
/ 12 декабря 2011

Я работаю над проектом, и мне нужно зашифровать строку с помощью AES. Программа должна иметь возможность либо принимать строку и выводить зашифрованную строку в шестнадцатеричном виде вместе с ключом, либо, используя указанный пользователем ключ и строку, выводить незашифрованный текст (то есть программа должна иметь возможность чтобы сделать обе эти вещи в разных случаях, то есть я должен иметь возможность ввести «1234» на моем компьютере и получить «Зашифрованный текст: asdf Key: ghjk»; мой друг должен иметь возможность вставить «Зашифрованный текст: asdf KEy» : ghjk "на свою и вылезай" 1234 ")

Вот что у меня есть:

package betterencryption;   

import javax.crypto.*;
import javax.crypto.spec.*;
import java.util.Scanner;

 public class BetterEncryption {

 public static String asHex (byte buf[]) {               //asHex works just fine, it's the main that's
                                                         //giving me trouble
  StringBuffer strbuf = new StringBuffer(buf.length * 2);
  int i;

  for (i = 0; i < buf.length; i++) {
   if (((int) buf[i] & 0xff) < 0x10)
    strbuf.append("0");

   strbuf.append(Long.toString((int) buf[i] & 0xff, 16));
  }

  return strbuf.toString();
 }

 public static void main(String[] args) throws Exception {
   Scanner sc = new Scanner(System.in);
   KeyGenerator kgen = KeyGenerator.getInstance("AES");kgen.init(128); 
   SecretKey skey = kgen.generateKey();
   byte[] bytes = skey.getEncoded();
   SecretKeySpec skeySpec = new SecretKeySpec(bytes, "AES");
   Cipher cipher = Cipher.getInstance("AES");
   System.out.print("Do you want to encrypt or unencrypt?\n");/*This is a weird way of doing it,*/
   String choice = sc.next(); char cc = choice.charAt(2);     /*I know, but this part checks to see if*/       
   if(cc=='c'){                                               /*the program is to encrypt or unencrypt*/
   System.out.print("Enter a string to encrypt: ");          /* a string. The 'encrypt' function works.*/
   String message = sc.next();


   cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
   byte[] encrypted = cipher.doFinal((args.length == 0 ? message : args[0]).getBytes());
   System.out.println("Encrypted string: " + asHex(encrypted)+"\nKey: "+asHex(bytes));

   //^This^ section actually works! The code outputs an encrypted string and everything.
   //It's beautiful
   //Unfortunately getting that string back into readable text has been problematic
   //Which is where you guys come in!
   //Hopefully

 }
  if(true){
   System.out.print("\nEnter the encrypted string: "); String encryptedString = sc.next();
   System.out.print("\nEnter the key: "); String keyString = sc.next();
   int len = encryptedString.length();    /*this section converts the user-input string*/
   byte[] encrypted = new byte[len / 2];  /*into an array of bytes*/
   for (int i = 0; i < len; i += 2) {     /*I'm not sure if it works, though*/
   encrypted[i / 2] = (byte) ((Character.digit(encryptedString.charAt(i), 16) << 4)+
           Character.digit(encryptedString.charAt(i+1), 16));
   cipher.init(Cipher.DECRYPT_MODE, skeySpec); /*as you can see, I haven't even begun to implement*/ 
   byte[] original = cipher.doFinal(encrypted);/*a way to allow the user-input key to be used.*/
   String originalString = new String(original);
   System.out.println("\nOriginal string: "+originalString); //I'm really quite stuck.
      //can you guys help?
  } 

 }
   }
}

Что ж, надеюсь, мне кто-нибудь поможет.

EDIT:

Мои самые большие проблемы - это преобразовать String encryptedString в sKeySpec и выяснить, как предотвратить функцию unencrypt, чтобы пользователь выдавал ошибку, говоря, что введенная ими строка не была заполнена должным образом. Я знаю, что это неправда, потому что я пытался зашифровать строку и затем вставить ее в зашифрованном виде в unencryptor только для того, чтобы получить ошибку. Программа работает нормально, если я устраню все условия «если» и просто зашифрую строку, а затем расшифрую в том же экземпляре; Я думаю, что это связано с сохранением случайного ключа keyGen

Ответы [ 2 ]

0 голосов
/ 12 декабря 2011

В зависимости от того, какой вариант AES вы используете, ваш ключ должен иметь длину 128, 192 или 256 бит. Вы можете использовать HashAlgorithm для генерации ключа определенной длины из пользовательского ввода.

String key;
byte[] keydata = hashFunctionToMakeToKeytheRightSize(key);
SecretKeySpec secretKeySpec = new SecretKeySpec(keydata, "AES");

См. Также: java-aes-and-using-my-own-key

0 голосов
/ 12 декабря 2011

Ваша проблема заключается в следующем:

KeyGenerator kgen = KeyGenerator.getInstance("AES");kgen.init(128); 
SecretKey skey = kgen.generateKey();
byte[] bytes = skey.getEncoded();
SecretKeySpec skeySpec = new SecretKeySpec(bytes, "AES");

Как вы написали, ваша программа генерирует новый случайный ключ при каждом запуске, который никогда не сохраняется и нигде не отображается.Все, что вы шифруете с помощью этого ключа, фактически невозможно расшифровать.

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

...