C# AES CFB加解密模式兼容JAVA代码片段
最近在和java做对接的时候老是遇到加密使用java写的,需要我们使用C#来解密相关数据,AES加解密平常也在用,但是这种跨语言的应用还是比较少,因为对方不知道使用的是哪些参数进行的加密,调试起来就比较耗时耗力,做个记录方便后期查漏补缺。
| using System.Security.Cryptography; |
| static void Example(int i) |
| { |
| Console.WriteLine(i+">>>>>>"); |
| |
| |
| |
| String Plain = "2121050"; |
| byte[] plainBytes = Encoding.ASCII.GetBytes(Plain); |
| Console.WriteLine("plaintext length is" + plainBytes.Length); |
| Console.WriteLine("Plaintext is" + BitConverter.ToString(plainBytes)); |
| |
| |
| |
| byte[] savedKey = Convert.FromBase64String("5S1I25wtR6vdJrlPwF4E1Q=="); |
| |
| var d = BitConverter.ToString(savedKey).Replace("-"," "); |
| |
| byte[] savedIV = new byte[16] {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; |
| byte[] cipherBytes; |
| using (RijndaelManaged Aes128 = new RijndaelManaged()) |
| { |
| |
| |
| |
| |
| Aes128.BlockSize = 128; |
| Aes128.KeySize = 128; |
| |
| |
| |
| |
| Aes128.Mode = CipherMode.CFB; |
| Aes128.FeedbackSize = 8*i; |
| Aes128.Padding = PaddingMode.Zeros; |
| |
| |
| |
| |
| |
| Aes128.Key = savedKey; |
| Aes128.IV = savedIV; |
| |
| |
| |
| |
| |
| using (var encryptor = Aes128.CreateEncryptor()) |
| using (var msEncrypt = new MemoryStream()) |
| using (var csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)) |
| using (var bw = new BinaryWriter(csEncrypt, Encoding.UTF8)) |
| { |
| bw.Write(plainBytes); |
| bw.Close(); |
| |
| cipherBytes = msEncrypt.ToArray(); |
| Console.WriteLine("Cipher length is" + cipherBytes.Length); |
| Console.WriteLine("Cipher text is" + BitConverter.ToString(cipherBytes)); |
| Console.WriteLine("AES Base64:" + Convert.ToBase64String(cipherBytes)); |
| } |
| } |
| |
| |
| |
| |
| |
| using (RijndaelManaged Aes128 = new RijndaelManaged()) |
| { |
| Aes128.BlockSize = 128; |
| Aes128.KeySize = 128; |
| Aes128.Mode = CipherMode.CFB; |
| Aes128.FeedbackSize = 8*i; |
| Aes128.Padding = PaddingMode.Zeros; |
| |
| Aes128.Key = savedKey; |
| Aes128.IV = savedIV; |
| |
| using (var decryptor = Aes128.CreateDecryptor()) |
| using (var msEncrypt = new MemoryStream(cipherBytes)) |
| using (var csEncrypt = new CryptoStream(msEncrypt, decryptor, CryptoStreamMode.Read)) |
| using (var br = new BinaryReader(csEncrypt, Encoding.UTF8)) |
| { |
| |
| plainBytes = br.ReadBytes(cipherBytes.Length); |
| |
| Console.WriteLine("Decrypted plain length is" + plainBytes.Length); |
| Console.WriteLine("Decrypted plain text bytes is" + BitConverter.ToString(plainBytes)); |
| Console.WriteLine("Decrypted plain text is" + Encoding.UTF8.GetString(plainBytes)); |
| } |
| } |
| } |
- 重点调试的参数就
FeedbackSize
,这个是CFB模式下特有的,常用的有8,64,128,这个现场恰恰用的是56这个模式。 Aes128.Padding = PaddingMode.Zeros;
设置Padding为0,这个也是要根据实际情况去调的。- 还有要注意的就是
byte[] savedKey = Convert.FromBase64String("5S1I25wtR6vdJrlPwF4E1Q==");
,Key的编码方式,这边Java用的是Base64模式,刚开始我没注意,使用的是UTF8模式进行转换,调试过程中各种问题,最后发现了这个隐蔽问题。
| static void Main(string[] args) |
| { |
| Example(7); |
| Console.ReadLine(); |
| } |
AES在线测试工具:在线测试工具

【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器
· 面试官:你是如何进行SQL调优的?