我已将其配置为使用以下方案来获取我的数据
AES(Bouncy Castle)
>名称:PBEWITHSHA256AND128BITAES-CBC-BC
>要求:Bouncy Castle API和JCE Unlimited Strength Policy Files
>哈希算法:SHA256
>哈希迭代:1000
现在,在回读我的配置数据时,我需要在使用之前解密信息,文档提供了有关此主题的以下信息.
Jasypt(以及Zuul)生成的加密值以盐为前缀(通常为8或16字节,具体取决于算法要求).然后它们是Base64编码的.解密结果是这样的:
>将Base64字符串转换为字节
>剥去前8或16个字节作为盐
>保留加密有效负载的剩余字节数
>使用salt,迭代计数和密码调用KDF函数以创建密钥.
>使用密钥解密加密的有效负载
更多细节:Zull Encryption wiki
基于以上细节,我写了下面的代码(我对安全性的了解非常有限)
public static string Decrypt(string cipher,string password) { const int saltLength = 16; const int iterations = 1000; byte[] cipherBytes = Convert.FromBase64String(cipher); byte[] saltBytes = cipherBytes.Take(saltLength).ToArray(); byte[] encryptedBytes = cipherBytes.Skip(saltLength).ToArray(); Rfc2898DeriveBytes key = new Rfc2898DeriveBytes(password,saltBytes,iterations); byte[] keyBytes = key.GetBytes(16); AesCryptoServiceProvider aesAlg = new AesCryptoServiceProvider(); aesAlg.KeySize = 256; aesAlg.BlockSize = 128; aesAlg.Key = key.GetBytes(aesAlg.KeySize / 8); aesAlg.IV = key.GetBytes(aesAlg.BlockSize / 8); ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key,aesAlg.IV); MemoryStream msDecrypt = new MemoryStream(encryptedBytes); CryptoStream csDecrypt = new CryptoStream(msDecrypt,decryptor,CryptoStreamMode.Read); StreamReader srDecrypt = new StreamReader(csDecrypt); return srDecrypt.ReadToEnd(); }
我将Zuul配置为使用以下密码进行加密
SimplePassword
p8C9hAHaoo0F25rMueT0+u0O6xYVpGIkjHmWqFJmTOvpV8+cipoDFIUnaOFF5ElQ
当我尝试使用上面的代码解密此字符串时,我得到以下异常
System.Security.Cryptography.CryptographicException : Padding is invalid and cannot be removed.
正如我之前提到的,我对这个主题的了解是有限的,我无法弄清楚文档中提供的信息是否不够,如果我在编写解密例程时做错了什么,或者我应该使用充气城堡解密也是如此.
任何帮助都将非常感激.
解决方法
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。