javasm2
TF32A09安全芯片优势:
1.高速数据流加密:集成了多种高速硬件加密算法模块,加密步骤由专有模块实现,使数据流加密的速度可高达25MB/s,有一个质的飞跃。
2.国内首家具有USB主接口:拥有两个USB-OTG 接口,可根据应用需求设置成Host、Device 或OTG;支持多达6 个端点,可设置成多重复合设备,最大限度地满足用户的设计需求。
3.算法全面:集成多种通信接口和多种信息安全算法(SM1、SM2、S
Ⅱ java和openssl生成sm2区别
区别如下:
1.客户端是Java开发的,服务端是C开发的,之间使用了SM2算法进行密钥交换。
2.Java端是在网上找的一个比较流行的基于BC的SM2实现,依赖的bcprov-jdk15on,版本1.56。C端是用的OpenSSL。
3.服务端和客户端联调时发现了很多问题,SM2算法的公钥加解密一直没法调通,但Java应用加密的数据可以自己解密成功,C应用加密的数据自己也可以解密成功。
Ⅲ java 类的静态变量 和 静态方法 能在同一时刻被多个自身对象调用么
当然可以,凡是静态标识的都是归属于类的,每个实例都能访问到。如果考虑到同步,还可以加synchronized关键字限制函数一次只允许一个线程访问,不过这会降低效率的。
Ⅳ c#的sm2和java区别
相同点:都是面向对象编程的语言,都能够实现面向对象的(封装,继承,多态)思想。不同点例如:
1、c#中的命名空间是namespace类似于Java中的package(包),在Java中导入包用import而c#中用using。
2、c#和Java都是从main函数入口的,但是c#中的main函数的首字母必须大写。
3、数据类型:Java跟c#基本都差不多,但是Java的String类型的首字母必须大写,而c#中可以小写也可以大写,还有布尔型,Java中是boolean,c#中是bool。
Ⅳ 企业文档加密软件哪个好
合力天下数据防泄密系统(HL-dataAS)用于保护企业的知识产权、客户资料、财务数据、技术图纸、应用系统等机密信息化数据不外泄。简单地说,”合力天下”防泄密系统让企业机密数据和应用系统的重要资料“拷不走”、“屏幕截取不走”、“另存不走”、“打印不走” 、“内容复制不走”、“MSN、QQ、邮件发送不走”。
一、支持各种文件格式加密(CAD、OFFICE、PDF、图纸、计算机程序、课件、游戏动画、数码照片、视频…..),用户也可以根据自己的需要定制;支持出差人员管理;支持文档外发管理;防止涉密文档非法扩散。支持控制台审批解密,支持手机审批解密。灵活的权限控制:只读,可写,可编辑,禁止删除;打印水印、禁止拍照等。
二、 支持局域网部署和互联网部署模式,支持总部和异地分支机构分别部署;支持单机部署模式;确保公司内部资料的相互流通。
三、支持各种应用系统:支持基于Windows的B/S、C/S的各种业务应用软件加密,如PDM、PLM、ERP、OA、CRM、CAM、HR、采编软件、流程管理软件、电子商务软件、财务软件、文档管理系统、网站服务器、云服务器、企业网盘、手机终端等。
四、 支持任意格式文档类型:Office、Open office、Wps、PDF、outlook、FOXMAIL、ARM、ANSYS、Easypro、OA系统、ERP、MSVISIO、 AutoCAD、Autodesk Inveator、Autovue、ACDSee、Pro/E、Inventor、CAXA、CAJviewer、Protel、PReS、Keil、Quartus、AVR Studio、 ARM Studio、Siemens Wicc、Xtcapp55、TurboCAD、开目CAD、TwinCAD、CATIA、Solid Edge、UG、PowerDraft、Photoline、清华天河CAD 、中望CAD、英泰CAD、浩辰CAD、凯思CAD、JEwelCAD、Code Wright、ULTRAEdit、Solidworks、SVN、ZDDS、IAR、PowerDesigner、FPWIN GR、FX-PCS-DU-WIN-C、FXGPWIN、PhptoShop、DreamWeaver、MTcardEdit、CorelDraw、Fireworks、Flash、ACDSee、ZineMarker、 HITACHI Embedded workshop、HIGH-Performance Embedded workshop、Embedded workshop、CAM350、Matlab、 Labview、Illustrator、 MAYA、3D MAX、unity、realplay、media player、Cakewalk、Flash、LRC Editor、Lightscape、Beyond Compare、Java、Delphi、VS.Net、C、 VB、VC、C++、Java虚拟机、Source Insight、WINRAR、EDITplus、IBM ClearCase、PowerBuilder、PowerPCB、Powerlogic、Power mill 、数控传输软件、视频文件、编程ICC、打标机(票据打印)、CAMtastic、DELcam-Exchange、cimatron、Macrumedia、Microchip、 MasterCAM、FastCAM、MyEclipse、Eclipse、Tomcat、MultiGen Creator、FoxPro、Access、MSSQL、Oracle、WinMerge、XOREAX、InCrediBuid、 ZBrush3、JDPaint、BodyPaint 3D、英泰PDM、NTKO、KASS、WINRAR、SILK ROAD、ETMARK、海康威视监控视频、邮箱大师、安卓手机、苹果手机等各种文档格式,即可自定义加密任意文件格式。
五、支持操作系统(32位 64位):支持Windows 2000、XP、2003、2008、2012、win7、win8、win10;LINUX;MAC OS;
六、 支持中文、英文、俄、日文、德文、韩文、法文、西班牙文等各种语言网络环境,支持中文、英文、俄、日文、德文、韩文、法文、西班牙文等各种语言文档加密。
Ⅵ 国密算法在java怎么调用
国密算法是国家密码局制定标准的一系列算法。其中包括了对称加密算法,椭圆曲线非对称加密算法,杂凑算法。具体包括SM1,SM2,SM3等,其中: SM2为国家密码管理局公布的公钥算法,其加密强度为256位。
Ⅶ 国密算法
国密即国家密码局认定的国产密码算法。主要有SM1,SM2,SM3,SM4。密钥长度和分组长度均为128位。
SM1 为对称加密。其加密强度与AES相当。该算法不公开,调用该算法时,需要通过加密芯片的接口进行调用。
SM2为非对称加密,基于ECC。该算法已公开。由于该算法基于ECC,故其签名速度与秘钥生成速度都快于RSA。ECC 256位(SM2采用的就是ECC 256位的一种)安全强度比RSA 2048位高,但运算速度快于RSA。
国家密码管理局公布的公钥算法,其加密强度为256位
SM3 消息摘要。可以用MD5作为对比理解。该算法已公开。校验结果为256位。
SM4 无线局域网标准的分组数据算法。对称加密,密钥长度和分组长度均为128位。
由于SM1、SM4加解密的分组大小为128bit,故对消息进行加解密时,若消息长度过长,需要进行分组,要消息长度不足,则要进行填充。
分组密码算法(DES和SM4)、将明文数据按固定长度进行分组,然后在同一密钥控制下逐组进行加密,
公钥密码算法(RSA和SM2)、公开加密算法本身和公开公钥,保存私钥
摘要算法(SM3 md5) 这个都比较熟悉,用于数字签名,消息认证,数据完整性,但是sm3安全度比md5高
总得来说国密算法的安全度比较高,2010年12月推出,也是国家安全战略,现在银行都要要求国际算法改造,要把国际算法都给去掉
C 语言实现
https://github.com/guan/GmSSL/
Go 语言
https://github.com/tjfoc/gmsm
https://github.com/ZZMarquis/gm
Java 语言
https://github.com/PopezLotado/SM2Java
Go语言实现,调用 gmsm
Ⅷ 算法与数据结构程序设计的问题!急啊!求帮忙
#include<stdio.h>
#include "iostream.h"
#include "stdlib.h"
#include<malloc.h>
#define MAXSIZE 12500
typedef struct {
int e;
int i,j;
}Triple;
typedef struct{
Triple data[MAXSIZE+1];
int mu,nu,tu;
}TSMatrix;
void InitTSM(TSMatrix &M);
void ShowTSM(TSMatrix &M);
void NormalTSMatrix(TSMatrix &M,TSMatrix &T);
void QuickTSM(TSMatrix &M,TSMatrix &T);
void SeqAdd(TSMatrix &a,TSMatrix &b,TSMatrix *c);
void Seqjian(TSMatrix &a,TSMatrix &b,TSMatrix *c);
void multsmatrix(TSMatrix &M,TSMatrix &N,TSMatrix *T);
void main()
{
int i;
TSMatrix sm,sm1,sm2,sm3,tsm;
cout<<"***********************************"<<endl;
InitTSM(sm);
cout<<""<<endl;
cout<<"**********************************"<<endl;
ShowTSM(sm);
cout<<""<<endl;
cout<<""<<endl;
do{
cout<<"**********************************"<<endl;
cout<<"请选择你想要的操作"<<endl;
cout<<""<<endl;
cout<<"1 矩阵相加"<<endl;
cout<<"2 矩阵想减"<<endl;
cout<<"3 矩阵相乘"<<endl;
cout<<"4 一般转置\n";
cout<<"5 快速转置:\n";
cin>>i;
switch(i)
{
case 1:
system("cls");
cout<<"请创建A矩阵"<<endl;
InitTSM(sm1);
ShowTSM(sm1);
cout<<"请创建B矩阵"<<endl;
InitTSM(sm2);
ShowTSM(sm2);
SeqAdd(sm1,sm2,&sm3);
cout<<"************************************"<<endl;
ShowTSM(sm3);
break;
case 2 :
Seqjian(sm1,sm2,&sm3);
ShowTSM(sm3);
break;
case 3:
multsmatrix(sm1,sm2,&sm3);
ShowTSM(sm3);
break;
case 4:
NormalTSMatrix(sm,tsm);
break;
case 5:
QuickTSM(sm,tsm);
break;
default:
cout<<"choose error!\n";
}
ShowTSM(tsm);
}while(i!=0);
}
void InitTSM(TSMatrix &M) //初始化数组元素
{
int e,m,n,t;
cout<<"请输入矩阵行数,列数,非零元素的个数:\n";
cin>>m>>n>>t;
M.mu=m;
M.nu=n;
M.tu=t;
for(int i=1;i<=t;i++)
{
cout<<"请输入元素所在行,列,和值:"<<endl;
cin>>m;
cin>>n;
cin>>e;
if(m<=0||n<=0||m>M.mu||n>M.nu)
{
cout<<"input error!\n";
i--;
}
else
{
M.data[i].i=m;
M.data[i].j=n;
M.data[i].e=e;
}
}
}
void ShowTSM(TSMatrix &M) //显示数组元素
{
int m,n,t=1;
cout<<"你输入的矩阵为:\n";
//for(int i=1;i<=M.nu;i++)
//cout<<i<<'\t';
//cout<<endl;
for(m=1;m<=M.mu;m++)
{
for(n=1;n<=M.nu;n++)
{
if(M.data[t].i==m&&M.data[t].j==n)
{
cout<<M.data[t].e<<'\t';
t++;
}
else
cout<<'0'<<'\t';
}
cout<<endl;
}
}
void NormalTSMatrix(TSMatrix &M,TSMatrix &T) //行扫描法
{
T.mu=M.nu;
T.nu=M.mu;
T.tu=M.tu;
if(T.tu)
{
int k=1;
for(int i=1;i<M.nu;i++)
for(int t=1;t<=M.tu;t++)
{
if(M.data[t].j==i)
{
T.data[k].i=M.data[t].j;
T.data[k].j=M.data[t].i;
T.data[k++].e=M.data[t].e;
}
}
}
}
void QuickTSM(TSMatrix &M,TSMatrix &T) //快速转置法
{
int p,col,t,q;
int *num=new int[M.nu];
int *cpot=new int[M.nu];
T.mu=M.nu;
T.nu=M.mu;
T.tu=M.tu;
if(T.tu)
{
for(col=1;col<=M.nu;col++)
num[col]=0;
for(p=1;p<=M.tu;p++)
++num[M.data[p].j];
cpot[1]=1;
for(col=2;col<=M.nu;col++)
cpot[col]=cpot[col-1]+num[col-1];
for(t=1;t<=M.tu;t++)
{
//int q=M[data[col].j]++;
col=M.data[t].j;
q=cpot[col];
T.data[q].i=col;
T.data[q].j=M.data[t].i;
T.data[q].e=M.data[t].e;
++cpot[col];
}
}
}
void SeqAdd(TSMatrix &a,TSMatrix &b,TSMatrix *c)
{
int i=1,j=1,k=1; //下标置初始值
while(i<=a.tu||j<=b.tu)
{
if(a.data[i].i==b.data[j].i) //a的行号等于b的行号
{
if(a.data[i].j==b.data[j].j)//a的列号等于b的列号
{
c->data[k].i=a.data[i].i;
c->data[k].j=a.data[i].j;
c->data[k].e=a.data[i].e+b.data[j].e;//此时将他们的数据直接相加
i++;
j++;
k++;
}
else if(a.data[i].j<b.data[j].j)//a的列号小于b的列号
{
c->data[k].i=a.data[i].i;
c->data[k].j=a.data[i].j;
c->data[k].e=a.data[i].e;//如果行号相等,则相加后的值等于列号更小的矩阵中对应元素的值
i++;
k++;
}
else if(a.data[i].j>b.data[j].j)//a的列号大于b的列号
{
c->data[k].i=b.data[j].i;
c->data[k].j=b.data[j].j;
c->data[k].e=b.data[j].e;//如果行号相等,则相加后的值等于列号更小的矩阵中对应元素的值
j++;
k++;
}
}
else if(a.data[i].i<b.data[j].i)//a的行号小于b的行号
{
c->data[k].i=a.data[i].i;
c->data[k].j=a.data[i].j;
c->data[k].e=a.data[i].e;//如果列号相等,则相加后的值等于行号更小的矩阵中对应元素的值
i++;
k++;
}
else if(a.data[i].i>b.data[j].i)//a的行号大于b的行号
{
c->data[k].i=b.data[j].i;
c->data[k].j=b.data[j].j;
c->data[k].e=b.data[j].e;//如果列号相等,则相加后的值等于行号更小的矩阵中对应元素的值
j++;
k++;
}
}
c->nu=a.nu;
c->mu=a.mu;
c->tu=k;
}
void Seqjian(TSMatrix &a,TSMatrix &b,TSMatrix *c)
{
int i=1,j=1,k=1; //下标置初始值
while(i<=a.tu||j<=b.tu)
{
if(a.data[i].i==b.data[j].i) //a的行号等于b的行号
{
if(a.data[i].j==b.data[j].j)//a的列号等于b的列号
{
c->data[k].i=a.data[i].i;
c->data[k].j=a.data[i].j;
c->data[k].e=a.data[i].e-b.data[j].e;//此时将他们的数据直接相加
i++;
j++;
k++;
}
else if(a.data[i].j<b.data[j].j)//a的列号小于b的列号
{
c->data[k].i=a.data[i].i;
c->data[k].j=a.data[i].j;
c->data[k].e=a.data[i].e;//如果行号相等,则相加后的值等于列号更小的矩阵中对应元素的值
i++;
k++;
}
else if(a.data[i].j>b.data[j].j)//a的列号大于b的列号
{
c->data[k].i=b.data[j].i;
c->data[k].j=b.data[j].j;
c->data[k].e=-b.data[j].e;//如果行号相等,则相加后的值等于列号更小的矩阵中对应元素的值
j++;
k++;
}
}
else if(a.data[i].i<b.data[j].i)//a的行号小于b的行号
{
c->data[k].i=a.data[i].i;
c->data[k].j=a.data[i].j;
c->data[k].e=a.data[i].e;//如果列号相等,则相加后的值等于行号更小的矩阵中对应元素的值
i++;
k++;
}
else if(a.data[i].i>b.data[j].i)//a的行号大于b的行号
{
c->data[k].i=b.data[j].i;
c->data[k].j=b.data[j].j;
c->data[k].e=-b.data[j].e;//如果列号相等,则相加后的值等于行号更小的矩阵中对应元素的值
j++;
k++;
}
}
c->nu=a.nu;
c->mu=a.mu;
c->tu=k;
}
void multsmatrix(TSMatrix &M,TSMatrix &N,TSMatrix *T)
{
int i,j,Qn=0;
int *Qe;
if(M.nu!=N.mu)
{cout<<"两矩阵无法相乘";}
T->mu=M.mu;
T->nu=N.nu;
Qe=(int *)malloc(M.mu*N.nu*sizeof(int)); /* Qe为矩阵Q的临时数组*/
for(i=1;i<=M.mu*N.nu;i++)
*(Qe+i)=0;/* 矩阵Q的第i行j列的元素值存于*(Qe+(M.data[i].i-1)*N.nu+N.data[j].j)中,初值为0 */
for(i=1;i<=M.tu;i++) /* 结果累加到Qe */
for(j=1;j<=N.tu;j++)
if(M.data[i].j==N.data[j].i)
*(Qe+(M.data[i].i-1)*N.nu+N.data[j].j)+=M.data[i].e*N.data[j].e;
for(i=1;i<=M.mu;i++) /*Qe矩阵中,因为M的每一行和N的每一列相乘都是T的一个元素,不管它是零或非零 */
for(j=1;j<=N.nu;j++) /*当M的第一行和N的第一列相乘则得T的第一个元素;当M的第一行和N的第二列相乘则得T的第二个元素;…… */
if(*(Qe+(i-1)*N.nu+j)!=0) /*……当M的第i行和N的第j列相乘则得T的第p个元素;根据归纳法得p=(i-1)*N的列数+j */
{
Qn++;//非零元个数加一
T->data[Qn].e=*(Qe+(i-1)*N.nu+j);
T->data[Qn].i=i;
T->data[Qn].j=j;
}
T->tu=Qn;
}
Ⅸ JAVA如何将一个二维数组拆分成多个二维数组
假如有个由从1-100组成的排成10*10的阵列 它就可以由一个二维数组M[10][10]表示
平均拆分成4个阵列分别赋给4个二维数组 每个数组就可以表示成SM[5][5]
所以纵向拆分可以表示成SM1[1][10]、SM2[2][10]、SM3[3][10]、SM4[4][10]
构造一个拆分方法需要2组4个参数 就是阵列的大小和第一子阵列的大小
还拿M[10][10]举例 第一组参数就是10 10 第二组比如说你要分成1 3
那第二三四子阵列自然就是SM[10-1][3]=SM[9][3],SM[1][10-3]=SM[1][7],
SM[10-1][10-3]=SM[9][7]
重构出的子阵列赋值的方法也是这样
Ⅹ 求ECDSA的Java代码
【方案1】
package ECDSA;
import com.sun.org.apache.xerces.internal.impl.dv.util.HexBin;
import java.security.*;
import java.security.interfaces.ECPrivateKey;
import java.security.interfaces.ECPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
public class Ecdsa {
private static String src = "hello berber" ;
public static void main(String []args){
jdkECDSA();
}
public static void jdkECDSA(){
// 1.初始化密钥
try{
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("EC");
keyPairGenerator.initialize(256);
KeyPair keyPair = keyPairGenerator.generateKeyPair() ;
ECPublicKey ecPublicKey = (ECPublicKey)keyPair.getPublic() ;
ECPrivateKey ecPrivateKey = (ECPrivateKey)keyPair.getPrivate() ;
// 执行签名
PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(ecPrivateKey.getEncoded());
KeyFactory keyFactory = KeyFactory.getInstance("EC") ;
PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec) ;
Signature signature = Signature.getInstance("SHA1withECDSA");
signature.initSign(privateKey);
signature.update(src.getBytes());
byte []arr = signature.sign();
System.out.println("jdk ecdsa sign :"+ HexBin.encode(arr));
// 验证签名
X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(ecPublicKey.getEncoded());
keyFactory = KeyFactory.getInstance("EC");
PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
signature = Signature.getInstance("SHA1withECDSA");
signature.initVerify(publicKey);
signature.update(src.getBytes());
boolean bool = signature.verify(arr);
System.out.println("jdk ecdsa verify:"+bool);
}catch(Exception e){
}
}
}
Java数字签名——ECDSA算法
【方案2】
public class MyTest {
/**
* @param args
*/
public static void main(String[] args) {
new MyTest().getSign();
}
void getSign() {
// Get the instance of the Key Generator with "EC" algorithm
try {
KeyPairGenerator g = KeyPairGenerator.getInstance("EC");
ECGenParameterSpec kpgparams = new ECGenParameterSpec("secp256r1");
g.initialize(kpgparams);
KeyPair pair = g.generateKeyPair();
// Instance of signature class with SHA256withECDSA algorithm
Signature ecdsaSign = Signature.getInstance("SHA256withECDSA");
ecdsaSign.initSign(pair.getPrivate());
System.out.println("Private Keys is::" + pair.getPrivate());
System.out.println("Public Keys is::" + pair.getPublic());
String msg = "text ecdsa with sha256";//getSHA256(msg)
ecdsaSign.update((msg + pair.getPrivate().toString())
.getBytes("UTF-8"));
byte[] signature = ecdsaSign.sign();
System.out.println("Signature is::"
+ new BigInteger(1, signature).toString(16));
// Validation
ecdsaSign.initVerify(pair.getPublic());
ecdsaSign.update(signature);
if (ecdsaSign.verify(signature))
System.out.println("valid");
else
System.out.println("invalid!!!!");
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}}
java – 使用secp256r1曲线和SHA256算法生
怎么验证生成的Ecdsa签名是正确的呢,可以看下这篇文章:RSA,ECC,Ecdsa,国密SM2的签名,验签,加密