當前位置:首頁 » 編程語言 » javasm2

javasm2

發布時間: 2022-12-31 19:57:25

Ⅰ 如何把sm2演算法封裝到java

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的簽名,驗簽,加密

熱點內容
速騰超越版14有哪些配置 發布:2025-07-02 10:49:02 瀏覽:657
安卓手機高刷在哪裡 發布:2025-07-02 10:43:02 瀏覽:342
愛奇藝iphone緩存 發布:2025-07-02 10:38:00 瀏覽:841
南方次元的解壓 發布:2025-07-02 10:31:32 瀏覽:246
葉祖新編程 發布:2025-07-02 10:29:06 瀏覽:400
k4在哪裡下載安卓 發布:2025-07-02 10:15:32 瀏覽:909
魔獸腳本破解版 發布:2025-07-02 10:15:30 瀏覽:995
鋒雲7800伺服器無網路怎麼辦 發布:2025-07-02 10:03:53 瀏覽:1000
安卓哪個版本可以安裝sd卡 發布:2025-07-02 09:58:09 瀏覽:984
存儲包下行流量包 發布:2025-07-02 09:49:00 瀏覽:364