private String zPadding(String pubkeyHex,String inDataHex){
String smX="";
String smY="";
String userID="";
String hexdata = inDataHex;
String publicKeyHex = pubkeyHex;
if(publicKeyHex!=null&& !"".equals(publicKeyHex)){
smX=publicKeyHex.substring(0,64);
smY=publicKeyHex.substring(64,publicKeyHex.length());
}
userID="31323334353637383132333435363738";
byte[]zpading=SM2.Instance().sm2GetZSM( FileManager.hexToBytes(userID),smX, smY);
hexdata=FileManager.bytesToHex(zpading)+hexdata;
return hexdata;
}
初始向量設定是31323334353637383132333435363738 對應是12345678, 公鑰截取頭32位元組作為公鑰X,截取後32位元組作為公鑰Y ,使用公鑰X和Y做SM3運算
public byte[] sm2GetZSM(byte[] userId,String smX,String smY)
{
SM3Digest sm3 = new SM3Digest();
int len = userId.length * 8;
sm3.update((byte) (len >> 8 & 0xFF));
sm3.update((byte) (len & 0xFF));
sm3.update(userId, 0, userId.length);
byte[] p = Util.byteConvert32Bytes(ecc_a);
sm3.update(p, 0, p.length);
p = Util.byteConvert32Bytes(ecc_b);
sm3.update(p, 0, p.length);
p = Util.byteConvert32Bytes(ecc_gx);
sm3.update(p, 0, p.length);
p = Util.byteConvert32Bytes(ecc_gy);
sm3.update(p, 0, p.length);
//p = Util.byteConvert32Bytes(userKey.getX().toBigInteger());
p = Util.hexStringToBytes(smX);
sm3.update(p, 0, p.length);
// p = Util.byteConvert32Bytes(userKey.getY().toBigInteger());
p = Util.hexStringToBytes(smY);
sm3.update(p, 0, p.length);
byte[] md = new byte[sm3.getDigestSize()];
sm3.doFinal(md, 0);
return md;
}
可以下載下傳附件擷取
https://download.csdn.net/download/qgy92320/11878279