我正在做一个项目,我需要使用AES加密字符串。 该程序需要能够接受一个String并以十六进制形式输出一个加密的字符串以及一个密钥,或者使用用户指定的密钥和字符串来输出未加密的文本(也就是说,该程序必须能够在不同的实例中完成这两项操作,即我应该能够在计算机上输入“ 1234”并取出“加密文本:asdf密钥: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?
  } 

 }
   }
}

好吧,希望有人能帮助我。

编辑:

我最大的问题是将String encryptionString转换为sKeySpec,并弄清楚如何防止“ unencrypt”功能给用户一个错误,指出他们输入的字符串未正确填充。 我知道这是不对的,因为我尝试了对String进行加密,然后将其加密形式粘贴到uncryptor中只是为了得到一个错误。 如果我消除了所有的“ if”条件,并且只对它加密了一个字符串,然后在同一实例中对其进行了解密,则该程序运行良好。 我认为这是由于保留了keyGen的随机密钥

===============>>#1 票数:0

您的问题是这样的:

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

如您所写,程序每次运行时都会生成一个新的随机密钥,该密钥永远不会保存或显示在任何地方。 使用此密钥加密的任何内容实际上都无法解密。

您需要做的是提出一些方案,根据用户输入生成密钥,而不是使用KeyGenerator随机生成密钥。 该方案如何运作取决于您。

===============>>#2 票数:0

根据您使用的AES变体,密钥的长度需要为128、192或256位。 您可以使用HashAlgorithm从用户输入生成具有特定长度的密钥。

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

另请参阅: java-aes-and-using-my-own-key

  ask by Eric M. translate from so

未解决问题?本站智能推荐:

6回复

不正确的字符串加密/解密

我创建了此程序,以将String作为用户输入,并将该单词的每个字符与另一个特定字符交换来创建另一个单词。 但是输出与输入相同。
1回复

在Android中使用数组简单加密解密字符串

我的问题似乎很简单,我正在尝试在android中加密字符串。 该程序应该做什么 该程序的目的是在textbox1中放入一个单词或一个字母,单击“加密”按钮,textbox2应该在所输入字母的第二个数组中的同一位置显示该符号。 例如,如果单击ENCRYPT按钮,则我写letter
2回复

Java中字符串的AES加密/解密中的内存问题/泄漏

我的问题是我正在解密/加密来自不同线程的一些随机值的字符串集,但是经过多次迭代后,内存迅速增加。 我的观察是,内存增加是因为每次加密/解密都会导致新的String,并且由于此原因,内存也会增加。 还有一点需要注意的是,我的解密/加密字符串将具有与许多字符串加密/解密的相同字符串集(某些字
1回复

使用Aes加密对字符串进行加密和解密-C#

我想将一个加密的字符串作为字节数组存储在SQL数据库中,但无法弄清楚自己在做什么错。 代码是这样的: 用于'EncryptString'和'DecryptString'的代码是Microsoft的Aes类参考 (该示例位于页面末尾)中的代码。 我执行了我的代码,在消息框中提供的所
1回复

将HEX字符串转换回AES

这是我面临的问题。 服务器A(即IBM i740主机架)上运行的机制采用安全数据并使用AES对其进行加密。 现在我,我想获得ENCRYPTED数据(AES加密字符串),但由于它使用乱码,因此无法通过http传输。 因此,为了让我得到它,有一个Web服务暴露,发现AES加密字符串,HEX'e
4回复

用Java加密十六进制字符串

我想问关于我的问题的任何建议。 我需要加密一个十六进制字符串。 我一定不要使用Java的内置函数,因为它在我的服务器中不起作用。 简而言之,我必须对算法进行硬编码或对消息进行加密的任何方法。 有人可以帮助我吗? 非常感谢! 这是代码。 这些是我使用的方法。 没问题,如果
3回复

引脚加密4位数字到十六进制

这些是程序必须遵循的步骤: 要求用户输入4位数的密码。 [完成] 将4位数的引脚转换为十六进制。 [?] 生成两个大于1000的随机数并转换为十六进制。[?] 将转换后的图钉夹在两个随机转换的数字之间。 [可以做到] 到目前为止,我拥有的代码是:
1回复

使用十六进制字符串加密和解密

我搜索了很多,但我没有找到一个很好的解决方案如何解决这个问题。 我有一个应用程序,必须用AES 256解密长十六进制字符串。 为了测试它,我创建了一个测试方法,将长文本加密为十六进制,然后将其转换回来并解密。 如果我运行此方法,我总是会收到以下错误: 给定最终块未正确填充 。 我
1回复

Java AES加密整个字符串

如何使用AES加密整个字符串。 我下面的代码只加密到第一个识别的空间:(。我该如何解决这个问题?谢谢 编辑 OMG我不相信这一点,我怎么可能想念这个:(因为我的扫描仪接下来而不是nextLine ...这整天都让我感到尴尬,但是现在才真正考虑检查那个问题。问题解决了:)谢谢大家
3回复

Java AES加密问题

每次使用AES更改加密值时,请让任何人调查以下代码并让我知道该问题 码: 输出第一次我得到以下加密的字符串 我第二次得到以下加密的字符串 我有三个问题: 为什么加密的字符串不是常量? 如何设置Blocksize? ( AES.BlockSize