mysql udf sm4_SM4国密算法Java版

根据 国密SM4 文档 编写的一个Java 加密解密样例package javasm4;

/**

*

* @author Jeen

*/

public class JavaSM4 {

public static int[] key = new int[4];//密钥

public static int[] temp = new int[4];//中间量 存储运算结果

public static int[] rkey = new int[32];//轮密钥

public static int[] fk = {0xa3b1bac6, 0x56AA3350, 0x677d9197, 0xb27022dc}; //系统参数

public static int[] ck = {//ck[i][j] = (4i+j)×7(mod 256) i=0->31 j=0->3 //固定参数

0x00070e15, 0x1c232a31, 0x383f464d, 0x545b6269,

0x70777e85, 0x8c939aa1, 0xa8afb6bd, 0xc4cbd2d9,

0xe0e7eef5, 0xfc030a11, 0x181f262d, 0x343b4249,

0x50575e65, 0x6c737a81, 0x888f969d, 0xa4abb2b9,

0xc0c7ced5, 0xdce3eaf1, 0xf8ff060d, 0x141b2229,

0x30373e45, 0x4c535a61, 0x686f767d, 0x848b9299,

0xa0a7aeb5, 0xbcc3cad1, 0xd8dfe6ed, 0xf4fb0209,

0x10171e25, 0x2c333a41, 0x484f565d, 0x646b7279};

private static int[] sbi = { //sbi 用于8位置换的数组 sbox

0xd6,0x90,0xe9,0xfe,0xcc,0xe1,0x3d,0xb7,0x16,0xb6,0x14,0xc2,0x28,0xfb,0x2c,0x05,

0x2b,0x67,0x9a,0x76,0x2a,0xbe,0x04,0xc3,0xaa,0x44,0x13,0x26,0x49,0x86,0x06,0x99,

0x9c,0x42,0x50,0xf4,0x91,0xef,0x98,0x7a,0x33,0x54,0x0b,0x43,0xed,0xcf,0xac,0x62,

0xe4,0xb3,0x1c,0xa9,0xc9,0x08,0xe8,0x95,0x80,0xdf,0x94,0xfa,0x75,0x8f,0x3f,0xa6,

0x47,0x07,0xa7,0xfc,0xf3,0x73,0x17,0xba,0x83,0x59,0x3c,0x19,0xe6,0x85,0x4f,0xa8,

0x68,0x6b,0x81,0xb2,0x71,0x64,0xda,0x8b,0xf8,0xeb,0x0f,0x4b,0x70,0x56,0x9d,0x35,

0x1e,0x24,0x0e,0x5e,0x63,0x58,0xd1,0xa2,0x25,0x22,0x7c,0x3b,0x01,0x21,0x78,0x87,

0xd4,0x00,0x46,0x57,0x9f,0xd3,0x27,0x52,0x4c,0x36,0x02,0xe7,0xa0,0xc4,0xc8,0x9e,

0xea,0xbf,0x8a,0xd2,0x40,0xc7,0x38,0xb5,0xa3,0xf7,0xf2,0xce,0xf9,0x61,0x15,0xa1,

0xe0,0xae,0x5d,0xa4,0x9b,0x34,0x1a,0x55,0xad,0x93,0x32,0x30,0xf5,0x8c,0xb1,0xe3,

0x1d,0xf6,0xe2,0x2e,0x82,0x66,0xca,0x60,0xc0,0x29,0x23,0xab,0x0d,0x53,0x4e,0x6f,

0xd5,0xdb,0x37,0x45,0xde,0xfd,0x8e,0x2f,0x03,0xff,0x6a,0x72,0x6d,0x6c,0x5b,0x51,

0x8d,0x1b,0xaf,0x92,0xbb,0xdd,0xbc,0x7f,0x11,0xd9,0x5c,0x41,0x1f,0x10,0x5a,0xd8,

0x0a,0xc1,0x31,0x88,0xa5,0xcd,0x7b,0xbd,0x2d,0x74,0xd0,0x12,0xb8,0xe5,0xb4,0xb0,

0x89,0x69,0x97,0x4a,0x0c,0x96,0x77,0x7e,0x65,0xb9,0xf1,0x09,0xc5,0x6e,0xc6,0x84,

0x18,0xf0,0x7d,0xec,0x3a,0xdc,0x4d,0x20,0x79,0xee,0x5f,0x3e,0xd7,0xcb,0x39,0x48};

public static void main(String[] args)

{

JavaSM4 sm = new JavaSM4();

int[] msg = {0x01234567, 0x89abcdef, 0xfedcba98, 0x76543210};

int[] smsg = {0x595298c7, 0xc6fd271f, 0x0402f804, 0xc33d3f66};

key[0] = 0x01234567;

key[1] = 0x89abcdef;

key[2] = 0xfedcba98;

key[3] = 0x76543210;

int j=0,n=1000000;

long startTime = System.currentTimeMillis(); //获取开始时间

for(j=0; j

{

//msg = sm4(msg,1);//加密运算

smsg = sm4(smsg,0);//解密运算

}

long endTime = System.currentTimeMillis(); //获取结束时间

System.out.println("执行SM4加密运算"+n+"次时间: "+(endTime-startTime)+"ms");

}

private static int[] sm4(int[] t,int s) //s!=0 时为加密运算,s=0时为解密运算

{

rkey = initrk();

if(s == 0)

{

rkey = r(rkey);

}

int[] x = new int[36];

x[0] = t[0];

x[1] = t[1];

x[2] = t[2];

x[3] = t[3];

int i;

for(i=0;i<32;i++)

{

x[i+4] = f(x[i],x[i+1],x[i+2],x[i+3],rkey[i]);

}

x = r(x);

temp[0] = x[0];

temp[1] = x[1];

temp[2] = x[2];

temp[3] = x[3];

return temp;

}

private static int[] initrk()

{

int i;

int[] k = new int[36];

int[] rk = new int[32];

k[0] = key[0] ^ fk[0];

k[1] = key[1] ^ fk[1];

k[2] = key[2] ^ fk[2];

k[3] = key[3] ^ fk[3];

for(i=0;i<32;i++)

{

rk[i] = k[i+4] = k[i] ^ tn(k[i+1]^k[i+2]^k[i+3]^ck[i]);

}

return rk;

}

private static int[] r(int[] x)

{

int[] t = new int[x.length];

int i;

for(i=0; i

{

t[i] = x[x.length - 1 -i];

}

return t;

}

private static int f(int x0,int x1,int x2,int x3,int k)

{

return (x0 ^ t(x1 ^ x2 ^ x3 ^ k));

}

private static int t(int ta)

{

return l(tj(ta));

}

private static int tn(int ta)

{

return ln(tj(ta));

}

private static int l(int temp)

{

return temp ^ Px(temp,2) ^ Px(temp,10) ^ Px(temp,18) ^ Px(temp,24);

}

private static int ln(int temp)

{

return temp ^ Px(temp,13) ^ Px(temp,23);

}

private static int tj(int a)

{

byte[] b = new byte[4];

byte[] c = new byte[4];

c = intToBytes(a);

b[0] = sbox(c[0]);

b[1] = sbox(c[1]);

b[2] = sbox(c[2]);

b[3] = sbox(c[3]);

a = bytesToInt(b[0],b[1],b[2],b[3]);

return a;

}

private static byte sbox(byte a) //S盒 8 bit 置换

{

int t = (a << 24) >>> 24;

return (byte)sbi[t];

}

private static int Px(int x,int n) //整型循环左移运算 n <=32 //java中没有无符号整型,需要注意移位后的填充符

{

return ((x<>>(32-n)));

}

private static int bytesToInt(byte b0,byte b1,byte b2,byte b3) // int = 4 * byte = 32 bit unsigned

{

int tint = 0;

int temp = b0 << 24;

tint = temp;

temp = (b1 << 24) >>> 8;

tint |= temp;

temp = (b2 << 24) >>> 16;

tint |= temp;

temp = (b3 << 24) >>> 24;

tint |= temp;

return tint;

}

private static byte[] intToBytes(int i)

{

byte[] tbyte = new byte[4];

tbyte[0] = (byte)(i >>> 24);

tbyte[1] = (byte)((i<<8)>>>24);

tbyte[2] = (byte)((i<<16)>>>24);

tbyte[3] = (byte)((i<<24)>>>24);

return tbyte;

}

}

TODO: 1文件信息流处理   2长度不足的填充算法

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

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

相关文章

【转】.net框架读书笔记---CLR内存管理\垃圾收集(一)

一、垃圾收集平台基本原理解析 在C#中程序访问一个资源需要以下步骤&#xff1a; 调用中间语言&#xff08;IL&#xff09;中的newobj指令&#xff0c;为表示某个特定资源的类型实例分配一定的内存空间。初始化上一步所得的内存&#xff0c;设置资源的初始状态&#xff0c;从而…

gperftools mysql_利用 gperftools 对nginx mysql 内存管理 性能优化

利用 gperftools 对nginx 与 mysql 进行 内存管理 性能优化 降低负载.Gperftools 是由谷歌开发。官方对gperftools 的介绍为&#xff1a;These tools are for use by developers so that they can create more robust applications. Especially of use to those developing m…

【转】.net框架读书笔记---CLR内存管理\垃圾收集(二)

前几天学习了CLR垃圾收集原理和基本算法&#xff0c;但是那些是仅仅相对于托管堆而言的&#xff0c;任何非托管资源的类型&#xff0c;例如文件、网络资源等&#xff0c;都必须支持一种称为终止化&#xff08;finalization&#xff09;的操作。 终止化 终止化操作允许一种资源…

python time 时间戳_Python的time.time()返回本地或UTC时间戳吗?

这是可以在文本文件中使用的时间戳记的文本形式。(问题的标题在过去是不同的&#xff0c;因此对此答案的介绍进行了更改&#xff0c;以阐明如何将其解释为时间。[2016年1月14日更新])您可以使用.now()或.utcnow()来将时间戳记作为字符串获取datetime.datetime&#xff1a;>&…

【转】.net框架读书笔记---CLR内存管理\垃圾收集(三)

接上一篇.net框架读书笔记---CLR内存管理\垃圾收集&#xff08;二&#xff09;&#xff0c;主要学习了终止化对象&#xff08;实现了Finalize方法的对象&#xff09;&#xff0c;了解了终止化对象的弊端&#xff0c;学习了通过实现IDisposable接口&#xff0c;通过Dispose方法来…

mysql实验三单表和多表查询_数据库实验三(单表查询)

实验三:select sno,snamefrom student;//(1)查询全体学生的学号和姓名select *from student;//(2)查询全体学生的详细记录select sname,sage,sdeptfrom student where sdeptMA;//(3)查询软件学院的学生姓名、年龄、系别select distinct snofrom sc;//(4)查询所有选修过课程的学…

【转】.net框架读书笔记---CLR内存管理\垃圾收集(四)

弱引用 当一个根指向一个对象时&#xff0c;该对象不可能被垃圾收集器收集&#xff0c;在这种情况下&#xff0c;通常说存在一个该对象的强引用&#xff08;strong reference&#xff09;。垃圾收集器还支持弱引用&#xff08;weak reference&#xff09;的概念。弱引用允许垃圾…

1756冗余_AB冗余模块1756-RM

AB冗余模块1756-RM100-C30UKJ01100-C30UKJ10100-C30UKL00100-C30UKL10AB冗余模块1756-RM100-C30UKP00100-C30UL00AB冗余模块1756-RM100-C30UL10100-C30UN00AB冗余模块1756-RM100-C30UN10100-C30UP001756-RM ControLogix冗余模块140U-H-RM12B 140U塑壳断路器外部附件1756-RMC1 C…

【转】.net框架读书笔记---CLR内存管理\垃圾收集(五)

对象复苏 当一个终止化对象被认为死亡时&#xff0c;垃圾收集器可以强制使该对象获得重生&#xff08;进入终止化可达队列&#xff09;&#xff0c;因为这样才能调用对象的Finalize方法。在Finalize方法被调用之后&#xff0c;它才算真正的死亡了&#xff0c;一个终止化对象会经…

imp命令导入指定表_Oracle—— 导入/导出 数据:exp,imp 命令

exp&#xff0c;imp 命令是需要在windows 的 cmd 命令中执行的命令&#xff0c;主要用于数据的导入和导出工作&#xff0c;方便高效。远程地址—— ip&#xff1a;port/orcl 注&#xff1a;该远程地址不写&#xff0c;就意味着执行本地的库。Oracle的数据导出(1)导出数据的…

【转】.net框架读书笔记---CLR内存管理\垃圾收集(六)

对象代龄 代龄是旨在提高垃圾收集器性能的一种机制。有以下几点&#xff1a; 对象越新&#xff0c;其生存期越短&#xff1b;对象越老&#xff0c;其生存期越长&#xff1b;对托管堆的一部分执行垃圾收集要比对整个托管堆执行垃圾收集速度要快。在托管堆初始化时&#xff0c;其…

MySQL数据库开发理念_mysql之数据库基本理念

数据储存的问题&#xff1a;数据冗余和不一致数据访问困哪数据孤立完整性原子性问题例如AB2个账户&#xff0c;从A中向B转钱&#xff0c;不管如何转&#xff0c;A和B的总量是保持不变的。只要A减少&#xff0c;B就增加。并发访问异常安全性问题文件的分层&#xff1a;表示层&am…

【转】.net框架读书笔记---CLR内存管理\垃圾收集(七)

编程控制垃圾收集器 System.GC类型为应用程序提供了直接控制垃圾收集器的一些方法&#xff0c;可以通过GC.MaxGeneration来查询托管堆支持的最大代龄&#xff0c;目前为2。 通过下面方法执行垃圾收集器 GC.Collect(int);传递代龄&#xff0c;传递0&#xff0c;收集0代&#xff…

少年自学python笔记_自学python 笔记

print() 输入input() 输出python能够处理的数据类型:整数、浮点数、字符串("\"转义符,\n 换行)、布尔值/布尔代数(True、False(and【或】、or【于】、not【非】))(and&#xff1a;只有所有都为True&#xff0c;and运算结果才为True)(or:只要一个为True&#xff0c;or…

【转】深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第四节 参数传递对堆栈的影响 1

前言 虽然在.Net Framework 中我们不必考虑内在管理和垃圾回收(GC)&#xff0c;但是为了优化应用程序性能我们始终需要了解内存管理和垃圾回收(GC)。另外&#xff0c;了解内存管理可以帮助我们理解在每一个程序中定义的每一个变量是怎样工作的。 简介 这篇文章我们将介绍一些方…

java解析string_java读取文件内容为string字符串的方法

直接就把项目中的方法贴出来吧/*** 读出城市列表文件*/private String readCityFile() {File file02 new File(path_xinfu, "/cityList.json");FileInputStream is null;StringBuilder stringBuilder null;try {if (file02.length() ! 0) {/*** 文件有内容才去读文…

【转】深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第四节 参数传递对堆栈的影响 2

前言 虽然在.Net Framework 中我们不必考虑内在管理和垃圾回收(GC)&#xff0c;但是为了优化应用程序性能我们始终需要了解内存管理和垃圾回收(GC)。另外&#xff0c;了解内存管理可以帮助我们理解在每一个程序中定义的每一个变量是怎样工作的。 简介 继续上篇未完成的“参数传…

java 引用被回收_java GC 静态List 如果没有引用会被回收吗

垃圾收算法1.引用计数法(Reference Counting Collector)2.tracing算法(Tracing Collector)3.compacting算法(Compacting Collector)4.copying算法(Coping Collector)5。generation算法(Generational Collector)6.adaptive算法(Adaptive Collector)一个新的对象被创建&#xff0…

【转】深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第五节 引用类型复制问题及用克隆接口ICloneable修复

前言 虽然在.Net Framework 中我们不必考虑内在管理和垃圾回收(GC)&#xff0c;但是为了优化应用程序性能我们始终需要了解内存管理和垃圾回收(GC)。另外&#xff0c;了解内存管理可以帮助我们理解在每一个程序中定义的每一个变量是怎样工作的。 简介 这一节我们将介绍引用类型…

linux virt java_Linux下Java环境安装

本节主要讲解Linux(Centos 6.5)下Java环境的安装1. 卸载机器上默认安装的JDK在Linux环境下一般会默认安装jdk&#xff0c;为了自己项目的开发部署&#xff0c;一般情况要重新装jdk&#xff0c;而且自己装的Jdk相对来说易控制版本&#xff0c;稳定性更高。所以以下是我卸载预装J…