**结束。**此问题需要详细的调试信息。它目前不接受答案。
**想改进这个问题吗?**更新问题,使其成为堆栈溢出的主题。
四年前关门了。
改进这个问题
以下是java的代码:
public static String encrypt(String strToEncrypt)
{
try
{
String secretKey = "1234567890123456";
DESKeySpec keySpec = new DESKeySpec(secretKey.getBytes("UTF8"));
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey key = keyFactory.generateSecret(keySpec);
BASE64Encoder base64encoder = new BASE64Encoder();
byte[] cleartext = strToEncrypt.getBytes("UTF8");
Cipher cipher = Cipher.getInstance("DES");
cipher.init(Cipher.ENCRYPT_MODE, key);
String encrypted = base64encoder.encode(cipher.doFinal(cleartext));
return encrypted;
}
catch (Exception e)
{
return e.getMessage();
}
}
如何在c#中解密?尝试解决方案:
用java加密,用c解密aes 256位
但没用。
1条答案
按热度按时间x0fgdtte1#
基本上,由于没有向cipher.init调用提供初始化向量(iv),因此无法根据您提供的代码可靠地解密该输出。因此,使用随机iv。
更正上述问题后,以下代码可能会正常工作。你需要用正确的iv替换null。
但是,您所做的工作有很多安全问题(在我提供的代码中也有同样多的问题)。如果这不是一个爱好/理解项目,我建议您重新考虑您的安全设计:
你不应该把钥匙储存在密码里
不应该在字符串对象中存储敏感信息
当您不再需要敏感信息时,应立即用0s或其他非敏感数据覆盖它
你不应该使用des-它不再安全了
在c语言中,您可以使用securestring来减少敏感信息的暴露(但是,从中获取数据更加困难)
理想的情况是,加密/解密代码应该用非虚拟化语言完成,因为虚拟机能够在不通知您的情况下移动数据,因此可以在内存中留下敏感信息的痕迹
...