gpt4 book ai didi

java - AES key 加解密与RSA key

转载 作者:行者123 更新时间:2023-12-04 04:15:18 28 4
gpt4 key购买 nike

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

我认为我在使用 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("-------------------------------");
}

抱歉,如果我的代码一团糟。

最佳答案

当你这样做时:

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

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

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

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

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

关于java - AES key 加解密与RSA key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60811249/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com