【发布时间】:2017-08-02 13:34:01
【问题描述】:
在与伙伴的 JAVA API 通话时,有人要求我加密一些数据,他向我发送了以下有关加密算法的详细信息:
- 算法:AES256
- 密钥大小:256 位
- 加密模式:CBC(16 位块,PKCS5Padding 为 0)
- 输出类型:Base-64
- 密码:0xA8703827AE586460105696504327B7BB0806FEAE96BD664F89E36868FBB48E3D
- IV:是一个字节[16],值为0
我使用了下面的代码,但我没有得到与他匹配的结果:
public byte[] AES_Encrypt(byte[] bytesToBeEncrypted, byte[] passwordBytes)
{
byte[] encryptedBytes = null;
byte[] saltBytes = new byte[16] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
using (MemoryStream ms = new MemoryStream())
{
using (RijndaelManaged aes = new RijndaelManaged())
{
aes.KeySize = 256;
aes.BlockSize = 128;
var key = new Rfc2898DeriveBytes(passwordBytes, saltBytes, 1000);
aes.Key = key.GetBytes(aes.KeySize / 8);
aes.IV = key.GetBytes(aes.BlockSize / 8);
aes.Padding = PaddingMode.PKCS7;
aes.Mode = CipherMode.CBC;
using (var cs = new CryptoStream(ms, aes.CreateEncryptor(), CryptoStreamMode.Write))
{
cs.Write(bytesToBeEncrypted, 0, bytesToBeEncrypted.Length);
cs.Close();
}
encryptedBytes = ms.ToArray();
}
}
return encryptedBytes;
}
public string EncryptText(string input, string password)
{
byte[] bytesToBeEncrypted = Encoding.UTF8.GetBytes(input);
byte[] passwordBytes = Encoding.UTF8.GetBytes(password);
passwordBytes = SHA256.Create().ComputeHash(passwordBytes);
byte[] bytesEncrypted = AES_Encrypt(bytesToBeEncrypted, passwordBytes);
string result = Convert.ToBase64String(bytesEncrypted);
return result;
}
所以,当我们尝试加密 你好,你好吗? 时,我得到了不同的结果,我应该得到与他相同的结果,因为他将解密我发送的数据并会处理它。给定的示例应该有这样的结果:TJTojNoVgoqnhCj4uTv1jLBiZU7r+s/0Bm234bHU+S0=
【问题讨论】:
-
您需要提供 java 代码才能找出他们不同意的原因。
-
客户提到this,如果你找不到足够的,请告诉我向他询问更多信息
-
如您所见,您的代码与该代码之间存在巨大差异,尤其是在密钥和 IV 的派生方面。
-
@JamesKPolk,好的,但实际上,我无法修复它,我对这些东西并不专业,所以,如果你能指导我完成那将是很棒的。
标签: c# encryption aes