C# SM4加密_sql md5加密

C# SM4加密_sql md5加密usingSystem;usingSystem.Collections.Generic;usingSystem.IO;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;namespaceConsoleApp1{publicclassSM4{publicstaticintSM4_ENCRYPT=1;publicstaticintSM4_DECRYPT=0;p

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{

public class SM4
{

public static int SM4_ENCRYPT = 1;

    public static int SM4_DECRYPT = 0;
private long GET_ULONG_BE(byte[] b, int i)
{
long n = (long)(b[i] & 0xff) << 24 | (long)((b[i + 1] & 0xff) << 16) | (long)((b[i + 2] & 0xff) << 8)
| (long)(b[i + 3] & 0xff) & 0xffffffffL;
return n;
}
private void PUT_ULONG_BE(long n, byte[] b, int i)
{
b[i] = (byte)(int)(0xFF & n >> 24);
b[i + 1] = (byte)(int)(0xFF & n >> 16);
b[i + 2] = (byte)(int)(0xFF & n >> 8);
b[i + 3] = (byte)(int)(0xFF & n);
}
private long SHL(long x, int n)
{
return (x & 0xFFFFFFFF) << n;
}
private long ROTL(long x, int n)
{
return SHL(x, n) | x >> (32 - n);
}
private void SWAP(long[] sk, int i)
{
long t = sk[i];
sk[i] = sk[(31 - i)];
sk[(31 - i)] = t;
}
public static byte[] SboxTable = { (byte) 0xd6, (byte) 0x90, (byte) 0xe9, (byte) 0xfe, (byte) 0xcc,
(byte) 0xe1, 0x3d, (byte) 0xb7, 0x16, (byte) 0xb6, 0x14, (byte) 0xc2, 0x28, (byte) 0xfb, 0x2c, 0x05, 0x2b,
0x67, (byte) 0x9a, 0x76, 0x2a, (byte) 0xbe, 0x04, (byte) 0xc3, (byte) 0xaa, 0x44, 0x13, 0x26, 0x49,
(byte) 0x86, 0x06, (byte) 0x99, (byte) 0x9c, 0x42, 0x50, (byte) 0xf4, (byte) 0x91, (byte) 0xef, (byte) 0x98,
0x7a, 0x33, 0x54, 0x0b, 0x43, (byte) 0xed, (byte) 0xcf, (byte) 0xac, 0x62, (byte) 0xe4, (byte) 0xb3, 0x1c,
(byte) 0xa9, (byte) 0xc9, 0x08, (byte) 0xe8, (byte) 0x95, (byte) 0x80, (byte) 0xdf, (byte) 0x94,
(byte) 0xfa, 0x75, (byte) 0x8f, 0x3f, (byte) 0xa6, 0x47, 0x07, (byte) 0xa7, (byte) 0xfc, (byte) 0xf3, 0x73,
0x17, (byte) 0xba, (byte) 0x83, 0x59, 0x3c, 0x19, (byte) 0xe6, (byte) 0x85, 0x4f, (byte) 0xa8, 0x68, 0x6b,
(byte) 0x81, (byte) 0xb2, 0x71, 0x64, (byte) 0xda, (byte) 0x8b, (byte) 0xf8, (byte) 0xeb, 0x0f, 0x4b, 0x70,
0x56, (byte) 0x9d, 0x35, 0x1e, 0x24, 0x0e, 0x5e, 0x63, 0x58, (byte) 0xd1, (byte) 0xa2, 0x25, 0x22, 0x7c,
0x3b, 0x01, 0x21, 0x78, (byte) 0x87, (byte) 0xd4, 0x00, 0x46, 0x57, (byte) 0x9f, (byte) 0xd3, 0x27, 0x52,
0x4c, 0x36, 0x02, (byte) 0xe7, (byte) 0xa0, (byte) 0xc4, (byte) 0xc8, (byte) 0x9e, (byte) 0xea, (byte) 0xbf,
(byte) 0x8a, (byte) 0xd2, 0x40, (byte) 0xc7, 0x38, (byte) 0xb5, (byte) 0xa3, (byte) 0xf7, (byte) 0xf2,
(byte) 0xce, (byte) 0xf9, 0x61, 0x15, (byte) 0xa1, (byte) 0xe0, (byte) 0xae, 0x5d, (byte) 0xa4, (byte) 0x9b,
0x34, 0x1a, 0x55, (byte) 0xad, (byte) 0x93, 0x32, 0x30, (byte) 0xf5, (byte) 0x8c, (byte) 0xb1, (byte) 0xe3,
0x1d, (byte) 0xf6, (byte) 0xe2, 0x2e, (byte) 0x82, 0x66, (byte) 0xca, 0x60, (byte) 0xc0, 0x29, 0x23,
(byte) 0xab, 0x0d, 0x53, 0x4e, 0x6f, (byte) 0xd5, (byte) 0xdb, 0x37, 0x45, (byte) 0xde, (byte) 0xfd,
(byte) 0x8e, 0x2f, 0x03, (byte) 0xff, 0x6a, 0x72, 0x6d, 0x6c, 0x5b, 0x51, (byte) 0x8d, 0x1b, (byte) 0xaf,
(byte) 0x92, (byte) 0xbb, (byte) 0xdd, (byte) 0xbc, 0x7f, 0x11, (byte) 0xd9, 0x5c, 0x41, 0x1f, 0x10, 0x5a,
(byte) 0xd8, 0x0a, (byte) 0xc1, 0x31, (byte) 0x88, (byte) 0xa5, (byte) 0xcd, 0x7b, (byte) 0xbd, 0x2d, 0x74,
(byte) 0xd0, 0x12, (byte) 0xb8, (byte) 0xe5, (byte) 0xb4, (byte) 0xb0, (byte) 0x89, 0x69, (byte) 0x97, 0x4a,
0x0c, (byte) 0x96, 0x77, 0x7e, 0x65, (byte) 0xb9, (byte) 0xf1, 0x09, (byte) 0xc5, 0x6e, (byte) 0xc6,
(byte) 0x84, 0x18, (byte) 0xf0, 0x7d, (byte) 0xec, 0x3a, (byte) 0xdc, 0x4d, 0x20, 0x79, (byte) 0xee, 0x5f,
0x3e, (byte) 0xd7, (byte) 0xcb, 0x39, 0x48 };
public static int[] FK = { -1548633402, 0x56aa3350, 0x677d9197, -1301273892 };
public static int[] CK = { 462357, 472066609, 943670861, 1415275113, 1886879365, -1936483679, 
-1464879427, -993275175, -521670923, -66909679, 404694573, 876298825, 1347903077, 1819507329, 
-2003855715, -1532251463, -1060647211, -589042959, -117504499, 337322537, 808926789, 1280531041, 
1752135293, -2071227751, -1599623499, -1128019247, -656414995, -184876535, 269950501, 741554753, 1213159005, 1684763257 };
private byte sm4Sbox(byte inch)
{
int i = inch & 0xFF;
byte retVal = SboxTable[i];
return retVal;
}
private long sm4Lt(long ka)
{
long bb = 0L;
long c = 0L;
byte[] a = new byte[4];
byte[] b = new byte[4];
PUT_ULONG_BE(ka, a, 0);
b[0] = sm4Sbox(a[0]);
b[1] = sm4Sbox(a[1]);
b[2] = sm4Sbox(a[2]);
b[3] = sm4Sbox(a[3]);
bb = GET_ULONG_BE(b, 0);
c = bb ^ ROTL(bb, 2) ^ ROTL(bb, 10) ^ ROTL(bb, 18) ^ ROTL(bb, 24);
return c;
}
private long sm4F(long x0, long x1, long x2, long x3, long rk)
{
return x0 ^ sm4Lt(x1 ^ x2 ^ x3 ^ rk);
}
private long sm4CalciRK(long ka)
{
long bb = 0L;
long rk = 0L;
byte[] a = new byte[4];
byte[] b = new byte[4];
PUT_ULONG_BE(ka, a, 0);
b[0] = sm4Sbox(a[0]);
b[1] = sm4Sbox(a[1]);
b[2] = sm4Sbox(a[2]);
b[3] = sm4Sbox(a[3]);
bb = GET_ULONG_BE(b, 0);
rk = bb ^ ROTL(bb, 13) ^ ROTL(bb, 23);
return rk;
}
private void sm4_setkey(long[] SK, byte[] key)
{
long[] MK = new long[4];
long[] k = new long[36];
int i = 0;
MK[0] = GET_ULONG_BE(key, 0);
MK[1] = GET_ULONG_BE(key, 4);
MK[2] = GET_ULONG_BE(key, 8);
MK[3] = GET_ULONG_BE(key, 12);
k[0] = MK[0] ^ (long)FK[0];
k[1] = MK[1] ^ (long)FK[1];
k[2] = MK[2] ^ (long)FK[2];
k[3] = MK[3] ^ (long)FK[3];
for (; i < 32; i++)
{
k[(i + 4)] = (k[i] ^ sm4CalciRK(k[(i + 1)] ^ k[(i + 2)] ^ k[(i + 3)] ^ (long)CK[i]));
SK[i] = k[(i + 4)];
}
}
private void sm4_one_round(long[] sk, byte[] input, byte[] output)
{
int i = 0;
long[] ulbuf = new long[36];
ulbuf[0] = GET_ULONG_BE(input, 0);
ulbuf[1] = GET_ULONG_BE(input, 4);
ulbuf[2] = GET_ULONG_BE(input, 8);
ulbuf[3] = GET_ULONG_BE(input, 12);
while (i < 32)
{
ulbuf[(i + 4)] = sm4F(ulbuf[i], ulbuf[(i + 1)], ulbuf[(i + 2)], ulbuf[(i + 3)], sk[i]);
i++;
}
PUT_ULONG_BE(ulbuf[35], output, 0);
PUT_ULONG_BE(ulbuf[34], output, 4);
PUT_ULONG_BE(ulbuf[33], output, 8);
PUT_ULONG_BE(ulbuf[32], output, 12);
}
private byte[] padding(byte[] input, int mode)
{
if (input == null)
{
return null;
}
byte[] ret = (byte[])null;
if (mode == SM4_ENCRYPT)
{
int p = 16 - input.Length % 16;
ret = new byte[input.Length + p];
Array.Copy(input, 0, ret, 0, input.Length);
for (int i = 0; i < p; i++)
{
ret[input.Length + i] = (byte)p;
}
}
else
{
int p = input[input.Length - 1];
ret = new byte[input.Length - p];
Array.Copy(input, 0, ret, 0, input.Length - p);
}
return ret;
}
public void sm4_setkey_enc(SM4_Context ctx, byte[] key)
{
if (ctx == null)
{
throw new Exception("ctx is null!");
}
/*if (key == null || key.length != 16) {
throw new Exception("key error!");
}*/
if (key == null || key.Length != 32)
{
throw new Exception("key error!");
}
ctx.mode = SM4_ENCRYPT;
sm4_setkey(ctx.sk, key);
}
public void sm4_setkey_dec(SM4_Context ctx, byte[] key)
{
if (ctx == null)
{
throw new Exception("ctx is null!");
}
/*if (key == null || key.length != 16) {
throw new Exception("key error!");
}*/
if (key == null || key.Length != 32)
{
throw new Exception("key error!");
}
int i = 0;
ctx.mode = SM4_DECRYPT;
sm4_setkey(ctx.sk, key);
for (i = 0; i < 16; i++)
{
SWAP(ctx.sk, i);
}
}
public byte[] sm4_crypt_ecb(SM4_Context ctx, byte[] input)
{
if (input == null)
{
throw new Exception("input is null!");
}
if ((ctx.isPadding) && (ctx.mode == SM4_ENCRYPT))
{
input = padding(input, SM4_ENCRYPT);
}
int length = input.Length;
MemoryStream bins = new MemoryStream(input);
MemoryStream bous = new MemoryStream();
for (; length > 0; length -= 16)
{
byte[] inByte = new byte[16];
byte[] outByte = new byte[16];
bins.Read(inByte, 0, inByte.Length);
sm4_one_round(ctx.sk, inByte, outByte);
bous.Write(outByte, 0, outByte.Length);
}
byte[] output = bous.ToArray();
if (ctx.isPadding && ctx.mode == SM4_DECRYPT)
{
output = padding(output, SM4_DECRYPT);
}
bins.Dispose();
bous.Dispose();
return output;
}
public byte[] sm4_crypt_cbc(SM4_Context ctx, byte[] iv, byte[] input)
{
if (iv == null || iv.Length != 16)
{
throw new Exception("iv error!");
}
if (input == null)
{
throw new Exception("input is null!");
}
if (ctx.isPadding && ctx.mode == SM4_ENCRYPT)
{
input = padding(input, SM4_ENCRYPT);
}
int i = 0;
int length = input.Length;
MemoryStream bins = new MemoryStream(input);
MemoryStream bous = new MemoryStream();
if (ctx.mode == SM4_ENCRYPT)
{
for (; length > 0; length -= 16)
{
byte[] inByte = new byte[16];
byte[] outByte = new byte[16];
byte[] out1 = new byte[16];
bins.Read(inByte, 0, inByte.Length);
for (i = 0; i < 16; i++)
{
outByte[i] = ((byte)(inByte[i] ^ iv[i]));
}
sm4_one_round(ctx.sk, outByte, out1);
Array.Copy(out1, 0, iv, 0, 16);
bous.Write(out1, 0, out1.Length);
}
}
else
{
byte[] temp = new byte[16];
for (; length > 0; length -= 16)
{
byte[] inByte = new byte[16];
byte[] outByte = new byte[16];
byte[] out1 = new byte[16];
bins.Read(inByte, 0, inByte.Length);
Array.Copy(inByte, 0, temp, 0, 16);
sm4_one_round(ctx.sk, inByte, outByte);
for (i = 0; i < 16; i++)
{
out1[i] = ((byte)(outByte[i] ^ iv[i]));
}
Array.Copy(temp, 0, iv, 0, 16);
bous.Write(out1,0,out1.Length);
}
}
byte[] output = bous.ToArray();
if (ctx.isPadding && ctx.mode == SM4_DECRYPT)
{
output = padding(output, SM4_DECRYPT);
}
bins.Dispose();
bous.Dispose();
return output;
}
}

}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/185444.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • psutil的Process python获取进程信息「建议收藏」

    psutil的Process python获取进程信息「建议收藏」系统进程信息psutil.Process()1.创建指定进程号的对象s=psutil.Process(1701)2.进程PID:pids.pid3.进程名称:name()s.name()4.进程当前状态:status()s.status()5.进程是否还在运行:is_running()返回此进程是否正在运行。它还检查PID是否已被另一个进程重用…

  • Java正则表达式(一看就懂)「建议收藏」

    Java正则表达式(一看就懂)「建议收藏」Java正则表达式一看就懂拿来即用

  • iOS开发之蓝牙通讯

    iOS开发之蓝牙通讯一、引言蓝牙是设备近距离通信的一种方便手段,在iPhone引入蓝牙4.0后,设备之间的通讯变得更加简单。相关的蓝牙操作由专门的CoreBluetooth.framework进行统一

    2021年12月21日
  • 网络攻防蓝军_网络攻防怎么学

    网络攻防蓝军_网络攻防怎么学永恒之蓝1.引言2.永恒之蓝定义3.SMB协议3.windows7版本说明4.攻击实例4.1攻击者和被攻击者展示4.2详细攻击过程4.3接下来尝试攻击一下windows105.参考文献1.引言让一个不爱学习的人整天蒙英语题,听张宇的视频实在是枯燥了点,于是决定看看网安,积累积累一些有趣的玩意儿。然后,自己不是专业的,也不是为了工作,可能会查阅大佬的博文,然后把概念借鉴过来,会留下参考链接的,如果博主不同意引用直接评论我会删除的。好,引用张宇一句话:直接来吧。

  • 2022最新淘宝商品详情接口采集方法

    2022最新淘宝商品详情接口采集方法最新淘宝商品详情接口采集

  • 大数据开发是干什么的(大数据开发是做什么的)

    据数联寻英发布《大数据人才报告》显示,目前全国的大数据人才仅46万,未来3-5年内大数据人才的缺口将高达150万,越来越多人加入到大数据培训,都希望在大数据培训机构中学习最前沿的知识,找一份不错的工作。大数据开发工程师主要负责的工作有以下内容:1.负责公司大数据平台的开发和维护,负责大数据平台持续集成相关工具平台的架构设计与产品开发等工作;2.主要从事网络日志的大数据分析工作,包括…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号