首页 > 编程语言 >C# AES CFB加解密模式兼容JAVA

C# AES CFB加解密模式兼容JAVA

时间:2022-12-02 23:01:07浏览次数:61  
标签:AES JAVA C# Console Aes128 WriteLine new var using


C# AES CFB加解密模式兼容JAVA代码片段

最近在和java做对接的时候老是遇到加密使用java写的,需要我们使用C#来解密相关数据,AES加解密平常也在用,但是这种跨语言的应用还是比较少,因为对方不知道使用的是哪些参数进行的加密,调试起来就比较耗时耗力,做个记录方便后期查漏补缺。

using System.Security.Cryptography;
static void Example(int i)
{
Console.WriteLine(i+">>>>>>");
//
// Encrypt a small sample of data
//
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())
{
//
// Specify a blocksize of 128, and a key size of 128, which make this
// instance of RijndaelManaged an instance of AES 128.
//
Aes128.BlockSize = 128;
Aes128.KeySize = 128;

//
// Specify CFB8 mode
//
Aes128.Mode = CipherMode.CFB;
Aes128.FeedbackSize = 8*i;
Aes128.Padding = PaddingMode.Zeros;
//
// Generate and save random key and IV.
//
//Aes128.GenerateKey();
//Aes128.GenerateIV();
Aes128.Key = savedKey;
Aes128.IV = savedIV;


//Aes128.Key.CopyTo(savedKey, 0);
//Aes128.IV.CopyTo(savedIV, 0);

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));
}
}

//
// Now decrypt the cipher back to plaintext
//

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))
{
//csEncrypt.FlushFinalBlock();
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));
}
}
}
  1. 重点调试的参数就​​FeedbackSize​​,这个是CFB模式下特有的,常用的有8,64,128,这个现场恰恰用的是56这个模式。
  2. ​Aes128.Padding = PaddingMode.Zeros;​​ 设置Padding为0,这个也是要根据实际情况去调的。
  3. 还有要注意的就是​​byte[] savedKey = Convert.FromBase64String("5S1I25wtR6vdJrlPwF4E1Q==");​​,Key的编码方式,这边Java用的是Base64模式,刚开始我没注意,使用的是UTF8模式进行转换,调试过程中各种问题,最后发现了这个隐蔽问题。
static void Main(string[] args)
{
Example(7);
Console.ReadLine();
}

AES在线测试工具:​​在线测试工具​

C# AES CFB加解密模式兼容JAVA_ci


标签:AES,JAVA,C#,Console,Aes128,WriteLine,new,var,using
From: https://blog.51cto.com/u_11295556/5907700

相关文章

  • Electron部署和打包
    最近玩Electron的桌面应用开发,虽然自己从事的是.NET方面的工作,但是作为技术栈的扩展,还是要去多了解一些新东西,为以后的项目做技术储备,废话不多说,本片主要描述如何使用squirr......
  • vue scss样式预处理在 vscode 中起作用,但是报错
      2.在最外层级,输入代码  "files.associations":{"*.vue":"vue"} ......
  • .Net Core SignalR 初体验
    前言Asp.NetSignalR已经出来很久了,但是一直没有静下心来好好看看。昨天花了几个小时的时间看了下。首先借鉴了官方文档,如何搭建一个SignalR的Demo。参考文章:ht......
  • securecrt9使用Python3
     很长一段时间,securecrt支持python,但版本为python2,而且自带的python解释器模块有缺失,关键是不支持三方库,使用上不方便。securecrt9.0开始支持Python3,不像python2.7......
  • ASP.NET Core SignalR .NET 客户端
    项目2022/11/2913个参与者反馈通过ASP.NETCoreSignalR.NET客户端库可以从.NET应用与SignalR中心进行通信。查看或下载示例代码(如何下载)本文......
  • async和await关键字
    async:表示函数是异步执行,await:表示当前函数先执行,执行完之后,再执行其他函数await用于等待一个promise对象,它只能在async函数中使用.async函数,会返回一个Promise对象,......
  • [ABC251Ex] Fill Triangle 题解
    [ABC251Ex]FillTriangleSolution目录[ABC251Ex]FillTriangleSolution更好的阅读体验戳此进入题面SolutionCodeUPD更好的阅读体验戳此进入题面存在序列$a_n$,将......
  • 力扣 leetcode 986. 区间列表的交集
    问题描述给定两个由一些闭区间组成的列表,firstList和secondList,其中firstList[i]=[starti,endi]而secondList[j]=[startj,endj]。每个区间列表都是成对不......
  • rockey linux8.7升级内核
    启用ELRepodnf-yinstallelrepo-releaserpm包在线安装yuminstallhttps://www.elrepo.org/elrepo-release-8.el8.elrepo.noarch.rpm查询ELRepo中的kernel版本#列......
  • 【Java并发入门】03 互斥锁(上):解决原子性问题
    原子性问题的源头是线程切换Q:如果禁用CPU线程切换是不是就解决这个问题了?A:单核CPU可行,但到了多核CPU的时候,有可能是不同的核在处理同一个变量,即便不切换线程,也有问......