c#实现生成AES加密的密钥key(密钥长度128位,也就是32个字符)对标Java中的AES加密(SHA1PRNG+Hex.encodeHexString)

news2024/11/14 14:27:49

最近在做某省份的一个健康云平台检验结果互认,我们的系统用的是C#,里面要求生成一个AES加密的密钥key(密钥长度128位,也就是32个字符),后面要用这个密钥key完成一系列加密操作,给的实例只有Java版本的获取该密钥的方法,在网上找了参考资料,整理出来了C#的对应实现,下面先看实例Java的代码实现和结果:

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Base64;

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


public static String generatorKey(String password) {
        try {
            KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
            // SecureRandom是生成安全随机数序列,password.getBytes()是种子,只要种子相同,序列就一样,所以解密只要有password就行
            SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
            secureRandom.setSeed(password.getBytes());
            keyGenerator.init(128, secureRandom);// 利用用户密码作为随机数初始化出, if没有将生成随机密钥
            SecretKey secretKey = keyGenerator.generateKey();// 根据用户密码,生成一个密钥
            byte[] encoded = secretKey.getEncoded();
            return Hex.encodeHexString(encoded);
        } catch (NoSuchAlgorithmException e) {
            // TODO: handle exception
            e.printStackTrace();
            return null;
        }
    }

注意,如果报Hex.encodeHexString 报错,是需要添加在Maven中添加依赖项

 <dependency>
            <groupId>org.apache.directory.studio</groupId>
            <artifactId>org.apache.commons.codec</artifactId>
            <version>1.8</version>
        </dependency>

password我们用123456,进行测试结果:

public static void main(String[] args) throws Exception {
        String password = "123456";
        System.out.println("密码是:" + password);
        String key = generatorKey(password);
        System.out.println("key:" + key);
    }

输出结果如下图:

---------------------------------------------下面是C#的实现--------------------------------------------------------------

/// <summary>
/// 生成一个AES加密的密钥key(密钥长度128位,也就是32个字符)
/// </summary>
public string generatorKey(string password)
{
    byte[] keyArray = null;
    using (var sha1 = new SHA1CryptoServiceProvider())
    {
        byte[] hash = sha1.ComputeHash(Encoding.UTF8.GetBytes(password));  
        var rd = sha1.ComputeHash(hash);
        keyArray = rd.Take(16).ToArray();
    }
    string hexString = string.Empty;
    if (keyArray != null)
    {
        StringBuilder strB = new StringBuilder();

        for (int i = 0; i < keyArray.Length; i++)
        {
            strB.Append(keyArray[i].ToString("X2"));
        }
        hexString = strB.ToString();
    }
    return hexString;
}

测试结果如下:

将Java的结果变成大写,用文本对比工具,对比后,结果一模一样

本次参考资料如下:

Java中的AES加密(SHA1PRNG)转换为C#(转载)_c# sha1prng-CSDN博客文章浏览阅读870次。这篇博客详细比较了Java和.NET(C#)中使用AES进行加密的实现方式,包括密钥生成和ECB模式下的PKCS5Padding填充。同时,展示了Base64编码在加密过程中的应用,提供了自定义Base64Encoder的实现代码,用于编码解码过程。https://blog.csdn.net/zyh_1988/article/details/125679958

java中Hex.encodeHexString方法的c#实现icon-default.png?t=N7T8https://www.cnblogs.com/zcjiang/p/7765594.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2070137.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

http应用层协议

一、万维网 用来存放各种资源的网络。 1、如何在万维网中表示一个资源 ? url ——统一资源定位符&#xff1b; 形式&#xff1a; <协议>://<主机>:<端口>/<路径>&#xff1b; <主机>:<端口>/<路径> //表示了资源所在的…

彩色墨水屏(电子纸)智能工牌,开启职场未来想象

随着技术的进步和生活方式的变革&#xff0c;越来越多职场人士希望佩戴的工牌能够展现独特的个人风格和专业特点&#xff0c;实现自动打卡、门禁管理等功能&#xff0c;提高工作效率&#xff0c;让职场生活更加便捷。 ​因此&#xff0c;快节奏的现代职场需一个既能满足员工对…

shadertoy sdSegment 原理

sdSegment 原理 float sdSegment( in vec2 p, in vec2 a, in vec2 b ) {vec2 pa p-a, ba b-a;float h clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 );return length( pa - ba*h ); }原理: u ⃗ \vec{u} u 在 v ⃗ \vec{v} v 在夹角是 θ \theta θ 的投影长度是: &#xff…

HTML5休闲小游戏《猫猫咖啡店》源码,引流、刷广告利器

HTML5休闲小游戏《猫猫咖啡店》源码&#xff0c;直接把源码上传到服务器就能使用了&#xff01; 下载链接&#xff1a;https://www.huzhan.com/code/goods468502.html

vscode修改选中文字颜色及当前tab颜色

VSCode-》首选项-》设置->-》搜color&#xff0c;找到&#xff1a;Workbench&#xff1a;Color Customizations&#xff0c;点击&#xff1a;在 settings.json 中编辑 加上 选中的文字内容的 配置 "workbench.colorCustomizations": {//设置用户选中代码段的颜色&…

贪心+栈。。

前言&#xff1a;这个题目一开始我没想通的就是如果s当前的一个字符或者之后的一个字符和当前t的尾巴是一样的&#xff0c;那么优先选哪一个&#xff0c;其实这个就要优先选t的 class Solution { public:string robotWithString(string s) {string ans;int cnt[26]{}, min 0; …

2024年AI编程新手必备工具,快速提升技能!

在当今这个技术日新月异的时代&#xff0c;AI编程已成为一个越来越重要的领域&#xff0c;吸引着众多新手和希望提升自己的中级开发者进入。 对于这些渴望在AI领域快速成长的人来说&#xff0c;选择合适的编程工具是至关重要的。 接下来&#xff0c;我们将深入探讨几款市场上…

Ubuntu22.04下安装LDAP

目录 1 简单说明2 安装配置2.1 安装1、安装前准备2、安装 OpenLADP3、配置OpenLDAP4、设置基本组5、添加新组5、添加 OpenLDAP 用户 2.2 安装 LDAP 帐户管理器1、安装2、配置 LDAP 帐户管理器 3 简单使用3.1 创建一个组3.2 创建一个用户 总结 1 简单说明 之前写过在Centos下的…

LLaVA 简介

好奇这张照片是在哪里拍摄的&#xff1f;问 LLaVA&#xff01;&#xff08;图片来自Pixabay的Guy Rey-Bellet&#xff09;。 LLaVA&#xff08;L arge L anguage 和V isual A ssistant 的缩写&#xff09;是一种很有前途的开源生成式人工智能模型&#xff0c;它复制了 OpenAI …

Arduino 定时器 [终极指南](原文)

Arduino Timers [Ultimate Guide] by Khaled Magdy In this tutorial, we’ll discuss Arduino Timers from the very basic concepts all the way to implementing Arduino timer-based systems. We’ll start off by discussing what is a timer, how they work, and what …

最近公共祖先(LCA),树上差分,树的直径总结

最近也是一不小心就学到了树论&#xff0c;这方面确实太不行了&#xff0c;也该开始学习一下了&#xff0c;那么话不多说&#xff0c;进入今日份的树论学习&#xff0c;直接开冲 最近公共祖先&#xff08;LCA&#xff09;——倍增思想&#xff08;可以结合我之前写的ST表学习&…

Windows安装java8\java17并存切换版本操作

问题描述&#xff1a; 首先肯定一台电脑可以安装多个JDK&#xff0c;切换版本也是可实现的。 存在版本切换问题是企业项目用java8&#xff0c;个人研究技术用的17。希望两者并存&#xff0c;随时切换&#xff0c;记录一下操作步骤。 第一&#xff1a;先安装不同版本的jdk到系…

vue项目中,修改elementui一些复杂控件样式

1.前言 在vue项目中&#xff0c;我们为了快速开发&#xff0c;会用到elementui。但很多时候&#xff0c;elementui的样式不满足于我们项目的样式需求。这时候我们需要修改原生elementui的样式。 2.简单控件的样式修改 对于elementui中一些简单的控件&#xff0c;如按钮之类的…

Xshell链接本地20.04Ubuntu虚拟机

一、打开虚拟机设置选择自定义-net8 二、打开虚拟网络编辑器&#xff0c;点击更改设置 三、打开网络设置&#xff0c;如图操作 四。打开虚拟机&#xff0c;进入终端&#xff0c;输入ifconfig 五、su root进入root模式&#xff0c;配置静态网卡 # 备份配置文件 cd /etc/netpla…

Qt:玩转QPainter序列一

前言 最近想潜心研究一下QPainter这个类&#xff0c;最好把QPainter所有的函数都敲一遍&#xff0c;特地记录一下。 在说QPainter之前我们需要了解两个非常重要的东西 第一个坐标系 我用两张图来表示 代码实操的结果 更加详细的坐标系内容请看我的另一篇博客 第二个是有…

一款基于cesium的开源地图工具

Cesium是一个开源的、世界级的、展现3D全球地图的JavaScript类库,它毫无疑问已然成为WebGIS开发中三维地球框架的首选。本次给大家带来的是一个结合CesiumVue的前端地图开发框架&#xff0c;支持很多种地图渲染特效&#xff0c;同时还支持模型加载到地图上面。 开源地址&#…

Linux安装显卡驱动

本文详细阐述了在Linux系统中安装显卡驱动的步骤和注意事项。首先&#xff0c;文章介绍了显卡驱动的重要性&#xff0c;以及为什么需要安装或更新显卡驱动。接着&#xff0c;针对不同类型的显卡&#xff08;如NVIDIA、AMD等&#xff09;&#xff0c;文章提供了具体的安装步骤和…

进程与程序的学习

1、进程与程序 程序:本地文件,编译后产生的文件.elf执行文件,存储在硬盘中的文件;进程:程序运行期间就是一个进程;(主要讨论两个进程的交互)程序是静态的,进程是动态的;程序执行后Linux内核自动完成虚拟内存(资源)分配,成进程; 将数据段、代码段这些运行时必要的…

ProxySQL 读写分离配置

ProxySQL 是一个高性能、高可用的 MySQL 代理软件&#xff0c;旨在提升 MySQL 数据库的可扩展性和性能。它可以在应用程序和 MySQL 服务器之间充当中间层&#xff0c;提供强大的路由、负载均衡和查询优化功能。 ProxySQL 的主要功能&#xff1a; 查询路由&#xff1a; ProxySQ…

王者站撸分析

王者站撸分析 问题背景 有这样两个角色 其中一个角色的被动是受到攻击会减少攻击者的攻速1%,该被动可以叠加40层 另一个角色的被动是攻击敌方会提升自己1%的免伤效果&#xff0c;该被动可以叠加20层。 在站撸情况下 哪方胜算更大&#xff1f; 为了解决这个问题&#xff0c;我…