首页 > 编程语言 >C#与Java互通AES算法加密解密

C#与Java互通AES算法加密解密

时间:2023-07-27 18:22:35浏览次数:31  
标签:AES Java String rijndaelCipher C# return new byte

C# 需要引用System.Security.Cryptography命名空间

/// <summary>AES加密</summary>

/// <param name="text">明文</param> /// <param name="key">密钥,长度为16的字符串</param> /// <param name="iv">偏移量,长度为16的字符串</param> /// <returns>密文</returns> public static string EncodeAES(string text, string key,string iv) {     RijndaelManaged rijndaelCipher = new RijndaelManaged();     rijndaelCipher.Mode = CipherMode.CBC;     rijndaelCipher.Padding = PaddingMode.Zeros;     rijndaelCipher.KeySize = 128;     rijndaelCipher.BlockSize = 128;     byte[] pwdBytes = System.Text.Encoding.UTF8.GetBytes(key);     byte[] keyBytes = new byte[16];     int len = pwdBytes.Length;     if (len > keyBytes.Length)         len = keyBytes.Length;     System.Array.Copy(pwdBytes, keyBytes, len);     rijndaelCipher.Key = keyBytes;     rijndaelCipher.IV = Encoding.UTF8.GetBytes(iv);     ICryptoTransform transform = rijndaelCipher.CreateEncryptor();     byte[] plainText = Encoding.UTF8.GetBytes(text);     byte[] cipherBytes = transform.TransformFinalBlock(plainText, 0, plainText.Length);     return Convert.ToBase64String(cipherBytes); }   /// <summary>AES解密</summary> /// <param name="text">密文</param> /// <param name="key">密钥,长度为16的字符串</param> /// <param name="iv">偏移量,长度为16的字符串</param> /// <returns>明文</returns> public static string DecodeAES(string text, string key,string iv) {     RijndaelManaged rijndaelCipher = new RijndaelManaged();     rijndaelCipher.Mode = CipherMode.CBC;     rijndaelCipher.Padding = PaddingMode.Zeros;     rijndaelCipher.KeySize = 128;     rijndaelCipher.BlockSize = 128;     byte[] encryptedData = Convert.FromBase64String(text);     byte[] pwdBytes = System.Text.Encoding.UTF8.GetBytes(key);     byte[] keyBytes = new byte[16];     int len = pwdBytes.Length;     if (len > keyBytes.Length)         len = keyBytes.Length;     System.Array.Copy(pwdBytes, keyBytes, len);     rijndaelCipher.Key = keyBytes;     rijndaelCipher.IV = Encoding.UTF8.GetBytes(iv);     ICryptoTransform transform = rijndaelCipher.CreateDecryptor();     byte[] plainText = transform.TransformFinalBlock(encryptedData, 0, encryptedData.Length);     return Encoding.UTF8.GetString(plainText); }   Java,需要以下引用:

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

另外需要对String和byte[]相互转换的类,我自己写的Base64Helper

/**

 * @author miracle.qu  * @see AES算法加密明文  * @param data 明文  * @param key 密钥,长度16  * @param iv 偏移量,长度16  * @return 密文  */   public static String encryptAES(String data,String key,String iv) throws Exception {         try {             Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");             int blockSize = cipher.getBlockSize();             byte[] dataBytes = data.getBytes();             int plaintextLength = dataBytes.length;                           if (plaintextLength % blockSize != 0) {                 plaintextLength = plaintextLength + (blockSize - (plaintextLength % blockSize));             }               byte[] plaintext = new byte[plaintextLength];             System.arraycopy(dataBytes, 0, plaintext, 0, dataBytes.length);                            SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");             IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());               cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);             byte[] encrypted = cipher.doFinal(plaintext);               return Base64Helper.encode(encrypted).trim();           catch (Exception e) {             e.printStackTrace();             return null;         }     }       /**      * @author miracle.qu      * @see AES算法解密密文      * @param data 密文      * @param key 密钥,长度16      * @param iv 偏移量,长度16      * @return 明文      */     public static String decryptAES(String data,String key,String iv) throws Exception {         try         {             byte[] encrypted1 = Base64Helper.decode(data);                            Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");             SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");             IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());                            cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec);               byte[] original = cipher.doFinal(encrypted1);             String originalString = new String(original);             return originalString.trim();         }         catch (Exception e) {             e.printStackTrace();             return null;         }     }

 其中Base64Helper类是个简单的类,引用:

 

import org.apache.commons.codec.binary.Base64;

 

其中核心代码:

/**

 * 编码  * @param byteArray  * @return  */ public static String encode(byte[] byteArray) {     return new String(new Base64().encode(byteArray)); }   /**  * 解码  * @param base64EncodedString  * @return  */ public static byte[] decode(String base64EncodedString) {     return new Base64().decode(base64EncodedString); }

标签:AES,Java,String,rijndaelCipher,C#,return,new,byte
From: https://www.cnblogs.com/fyy1003668657/p/17585751.html

相关文章

  • 2023-7-27WPF的ContextMenu的传参绑定方式
    WPF的ContextMenu的绑定方式【作者】长生ContextMenu为何不能正常绑定在wpf中ContextMenu和ToolTip一样都是弹出层,与VisualTree已经分离了,只不过ToolTip在wpf中有进行特殊处理,所以可以正常绑定。个人觉得ContextMenu绑定的最可靠的方式首先添加BindingProxy类,继承Freezab......
  • C#中将字符串分割成字符数组
    在C#中字符串类型String是由一系列的单个字符组合而成,其实可以通过字符串String对象ToCharArray()方法来将字符串中的元素逐一存在数据类型为Char的一维数组中。例如将字符str="ABCDEFG"分割为到一维数组可用下列语句:stringstr="ABCD";char[]strCharArr=str.ToC......
  • MFC-文件操作CFile
             ......
  • plsql develop 单步调试oralce存储过程
    单步调试是排查程序中逻辑错误的最直接的途径,sqlserver中调试非常方便,即F11即可进入调试模式。而oralce中的调试就需要进行一点点设置,这里记录一下plsqldevelop单步调试的方法:首先,要有调试权限否则报:调试报错,提示ORA-01031:insufficientprivileges,则说明当前用户权限不......
  • 【报错修复】HRESULT: 0x80070057 The library hostfxr.dll was found, but loading i
    我写了一个winform程序,拷贝到win7系统上,提示需要下载.net给的链接是https://aka.ms/dotnet-core-applaunch?missing_runtime=true&arch=x64&rid=win7-x64&apphost_version=5.0.3&gui=true这台win7上不了网我用win10下载了这个链接的桌面运行时windowsdesktop-runtime-5.0......
  • TSINGSEE青犀视频汇聚融合平台EasyCVR的中性化版本如何配置?
    TSINGSEE青犀视频监控管理平台EasyCVR能在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、集中管理,实现视频资源的鉴权管理、按需调阅、全网分发、智能分析等,平台融合性强、开放度高、部署轻快,在智慧工地、智慧园区、智慧工厂、智慧码头、智慧水利等场景中有着广泛的应......
  • springboot实现链接生成QrCode
    1.注入依赖<dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.3.0</version></dependency><dependency><groupId>com.google.zxing</groupId>......
  • 深入研究java.lang.ThreadLocal类
    Synchronized用于线程间的数据共享,而ThreadLocal则用于线程间的数据隔离。一、概述ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是threadlocalvariable(线程局部变量)。也许把它命名为ThreadLocalVar更加合适。线程局部变量(ThreadLocal)......
  • android studio ninja: build stopped: subcommand failed.
    解决AndroidStudioNinjaBuild停止的问题概述在使用AndroidStudio进行开发时,有时候会遇到"androidstudioninja:buildstopped:subcommandfailed."的错误提示。这通常是由于项目构建过程中的某些问题导致的。下面我将详细介绍解决这个问题的步骤,并提供相应的代码示......
  • android studio javadoc 生成
    AndroidStudioJavadoc生成教程介绍在Android开发中,Javadoc是一种用于生成API文档的工具。通过使用Javadoc,可以为自己的代码生成详细的文档,方便团队协作和代码维护。本教程将介绍如何在AndroidStudio中生成Javadoc。流程下面是生成Javadoc的流程,你可以按照这些步骤来实现:......