【问题标题】:AES key encryption and decryption with RSA key使用 RSA 密钥的 AES 密钥加密和解密
【发布时间】:2020-03-23 09:55:49
【问题描述】:

我必须生成 AES 密钥,并且我有用于聊天应用程序的 RSA 密钥对。我必须用 AES 密钥加密消息,然后用公共 RSA 密钥加密 AES 密钥。之后,用户使用 RSA 私钥解密 AES 密钥,并使用给定的 AES 密钥解密消息。我测试了我的代码,但在使用公钥和私钥加密和解密后,我得到了不同的 AES 密钥。

我认为我在使用 Base64 编码/解码或使用一些关键功能(如 key.getEncodec 或 key.toString 方法)时遇到问题。

这是我的代码

public void sendMessage(User receiver, String message) throws Exception {

    //Generate AES key for encrypt message
    KeyGenerator keyGenerator=KeyGenerator.getInstance("AES");
    Integer keyBitSize=256;
    keyGenerator.init(keyBitSize);
    SecretKey simKey=keyGenerator.generateKey();
    System.out.println("AES KEY: "+simKey.getEncoded()+"\n");

    //Encrypt message
    Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
    cipher.init(Cipher.ENCRYPT_MODE, simKey);
    byte[] encMess1=cipher.doFinal(message.getBytes("UTF-8"));
    String messToWrite=Base64.getEncoder().encodeToString(encMess1);

    //Encrypt AES key
    byte[] KeyToEnc=simKey.getEncoded();
    cipher=Cipher.getInstance("RSA/ECB/PKCS1Padding");
    cipher.init(Cipher.ENCRYPT_MODE, receiver.getPub());
    cipher.update(KeyToEnc);
    byte[] AESEncWrt=cipher.doFinal();
    String aeskeyString=new String(Base64.getEncoder().encodeToString(AESEncWrt));
    System.out.println("AES ENC:"+aeskeyString+"\n");

    //Decrypt AES key
    byte[] KeyToDec=Base64.getDecoder().decode(aeskeyString.getBytes());
    cipher.init(Cipher.DECRYPT_MODE, receiver.getPriv());
    cipher.update(KeyToDec);
    byte[] decAesKey=cipher.doFinal();
    System.out.println("AES DEC: "+decAesKey+"\n");


    //Write message and AES key in file
    BufferedWriter messFile=new BufferedWriter(new FileWriter(receiver.getInbox()+"/"+getUsername()+".txt"));
    System.out.println("WRITING TO FILE:"+messToWrite+"\n");
    messFile.write(messToWrite);
    messFile.close();
    BufferedWriter aeswrite=new BufferedWriter(new FileWriter(receiver.getInbox()+"/"+getUsername()+"key.txt"));
    System.out.println("WRT KEY:"+aeskeyString+"\n");
    aeswrite.write(aeskeyString);
    aeswrite.close();

    System.out.println("-------------------------------");
}

对不起,如果我的代码是一团糟。

【问题讨论】:

    标签: java encryption cryptography aes rsa


    【解决方案1】:

    当你这样做时:

    System.out.println("AES KEY: "+simKey.getEncoded()+"\n");
    

    您不打印键的内容,而只是一个指向字节数组的“指针”。当您解密时,您最终会得到一个带有不同“指针”的新 byte[]

    您需要打印实际内容,例如十六进制。 Java 对十六进制打印的支持有限,但这样的事情会给你字节数组的十六进制表示:

    System.out.println(new BigInteger(1, simKey.getEncoded()).toString(16)); 
    

    请注意,代码中还有其他问题 - 比如您忽略了从 cipher.update(..) 返回的 byte[] 或使用带有 AES 的 ECB 模式..

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-08
      • 2018-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多