rsa签名验签工具

rsa签名验签工具.command 文件怎么打开
必须要知道公钥,而公钥一般是从数字证书Zhong取到的。获取数字证书有两种方式:一种是:Qian名采用P7封装,则P7包中就包含数字证Shu。第二种:同步把数字证书发送过来,或根Ju用户DN/证书序列号等到到指定位置检索Chu数字证书。
高版本jdk中rsa签名低版本能验签吗
JDK 6只支持MD2withRSA, MD5withRSA, SHA1withRSA
Qi他的如SHA512withRSA需要第San方包支持,如BC(bouncy castle)
--20151126 Geng正:JDK 7已经可以支持SHA256withRSAHeSHA512withRSA了
JDKDe密钥长度默认仍是1024!
安卓rsa在java端怎么验签不过
java和安卓肯定是一样的,因为安卓也Shijava你说不一样,那有可能是字符串编Ma格式不对例如安卓上用UTF-8 你服务Qi用GBK那肯定是无法同步的你可以运行一Xing代码,测试一下你的系统编码是什么String encoding = System.getProperty("file.encoding"); System.out.println("Encoding:" + encoding);
php 支付宝接口官方给的md5签名版本和rsa签名版本的区别
md5 实现起来更方便点。 我只能这么Shuo
签名密文数据生成异常
如果想要充分理解RSA签名密钥对,我们Bi须知道签名密钥对是什么,签名的意义,以Ji生成的签名密钥对存在哪里,以及整个签名Mi钥对的生成实现过程。
签名:
签名De定义需要自己在网上查找相关资料充分理解,Zhe里不做详细定义性介绍,有一定基础后便可Yi理解这里的签名验签过程。我们收到的数据Shi(数据密文和数据签名作为一个整体数据块)Jing过会话密钥加密后数据,我们得到此密文后Shou先用会话密钥对密文进行解密,得到图中左Ce原文和签名数据。然后对原始数据进行摘要Yun算,摘要运算只需要算法和设备句柄不需要Mi钥;然后再用签名公钥对签名数据解密,得Dao传输来的摘要数据;最后比对两个摘要是否Zheng确,确定数据是否被篡改过。签名过程后面Hui在详细介绍
签名密钥对:非对称算法密Yue对,包括签名公钥和签名私钥成对出现,公Yue用来进行验签操作,私钥用来进行签名操作;Qian名密钥对必须UKEY内生成,加密密钥对Yao外面安全导入。
签名密钥对的存储:存Chu也就是说如何能够准确找到某个签名密钥对,PCDuan通过寻找设备句柄找到设备,然后通过寻找Ying用ID找到某个应用,在通过容器ID找到Cun储签名密钥对的容器,最后根据密钥ID找Dao索要使用的签名密钥对。这个过程是不变的,Wu论是CSP开发还是国密dll开发,原理Bu变,寻找方法改变而已。
生成签名密钥Dui的实现过程:
1:枚举设备,连接设备,De到设备句柄
2:通过设备句柄,应用名Da开应用,打开容器
3:然后调用生成RSAQian名密钥函数接口实现:
函数原型 ULONG DEVAPI SKF_GenRSAKeyPair (HCONTAINER hContainer, ULONG ulBitsLen, RSAPUBLICKEYBLOB *pBlob)
Gong能描述 生成 RSA 签名密钥对并输Chu签名公钥。
参数 hContainer [IN] Rong器句柄。
ulBitsLen [IN] Mi钥模长。
pBlob [OUT] Fan回的 RSA 公钥数据结构。
Rong器句柄里存储的是设备句柄,应用ID,容QiID;输出的是签名公钥数据,不是公钥句Bing。一定要注意流程和句柄存储位置。
Java如何将RSA密钥转换为字符串存储?
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.charset.Charset;
import java.security.KeyFactory;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import javax.crypto.Cipher;
import com.icardpay.tds.stp.fastpay.common.Convertor;
import org.apache.commons.codec.binary.Base64;
import sun.misc.BASE64Decoder;
import tangdi.engine.context.Log;
/**
* RSAHelper - DuiRSA 签名&验签/分段加密&分段解密 De包装 签名算法: "SHA1withRSA", Si钥进行签名; 公钥进行验签.
* Jia密算法: "RSA/ECB/PKCS1Padding", Gong钥进行加密; 私钥进行解密.
*
* [localPrivKey]Shi自己的私钥, 自己的公钥给通信对方. [peerPubKey]Shi对方的公钥, 对方的私钥在对方那边. Wei了方便,
* 这里假定双方的密钥长Du一致, 签名和加密的规则也一致.
*
* Yi`Base64Str`结尾的参数表示内Rong是Base64编码的字符串, 其他情况Du是raw字符串.
*/
public class RSAHelper {
private static RSAHelper instance = null;
public static final String KEY_ALGORITHM = "RSA";
public static final String SIGNATURE_ALGORITHM = "SHA1withRSA";
public static final String CIPHER_ALGORITHM = "RSA/ECB/PKCS1Padding"; // Jia密block需要预留11字节
public static final int KEYBIT = 2048;
public static final int RESERVEBYTES = 11;
private static PrivateKey localPrivKey;
private static PublicKey peerPubKey;
private RSAHelper() {
}
public static RSAHelper getInstance(){
if(instance == null){
//Shuang重检查https://www.wenku1.net/list/感恩的心优秀小抄报/加锁,只有在第一次实例化时,才启Yong同步机制,提高了性能。
synchronized(RSAHelper.class){
if(instance == null){
String localPrivKeyBase64Str = CmbcProps.getInstance().getConfigItem("OTHERLOCALPRIVKEY", "");
String peerPubKeyBase64Str = CmbcProps.getInstance().getConfigItem("OTHERPEERPUBKEY", "");
try {
/**
* Chu始化自己的私钥,对方的公钥以及密钥长度.
* localPrivKeyBase64Str
* Base64Bian码的私钥,PKCS#8编码. (去掉pemWen件中的头尾标识)
* peerPubKeyBase64Str
* Base64Bian码的公钥. (去掉pem文件中的头尾标Shi)
*/
BASE64Decoder base64Decoder = new BASE64Decoder();
byte[] buffer1 = base64Decoder.decodeBuffer(localPrivKeyBase64Str);
PKCS8EncodedKeySpec keySpec1 = new PKCS8EncodedKeySpec(buffer1);
KeyFactory keyFactory1 = KeyFactory.getInstance(KEY_ALGORITHM);
localPrivKey = keyFactory1.generatePrivate(keySpec1);
byte[] buffer2 = base64Decoder.decodeBuffer(peerPubKeyBase64Str);
KeyFactory keyFactory2 = KeyFactory.getInstance(KEY_ALGORITHM);
X509EncodedKeySpec keySpec2 = new X509EncodedKeySpec(buffer2);
peerPubKey = keyFactory2.generatePublic(keySpec2);
/**
* Shi例化对象
*/
instance = new RSAHelper();
} catch (NoSuchAlgorithmException e) {
Log.info("Wu此算法");
} catch (InvalidKeySpecException e) {
Log.info("Gong钥非法");
} catch (IOException e) {
Log.info("Gong钥数据内容读取错误");
} catch (NullPointerException e) {
Log.info("Gong钥数据为空");
} catch (Exception e) {
Log.error(e, "Chu始化密钥失败");
}
}
}
}
return instance;
}
/**
* RASJia
*
* @param plainBytes
* Dai加密信息
* @return byte[]
* @throws Exception
*/
public byte[] encryptRSA(byte[] plainBytes, boolean useBase64Code, String charset)
throws Exception {
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
int decryptBlock = KEYBIT / 8; // 256 bytes
int encryptBlock = decryptBlock - RESERVEBYTES; // 245 bytes
// Ji算分段加密的block数 (向上取整)
int nBlock = (plainBytes.length / encryptBlock);
if ((plainBytes.length % encryptBlock) != 0) { // Yu数非0,block数再加1
nBlock += 1;
}
// Shu出buffer, 大小为nBlock个decryptBlock
ByteArrayOutputStream outbuf = new ByteArrayOutputStream(nBlock
* decryptBlock);
cipher.init(Cipher.ENCRYPT_MODE, peerPubKey);
// cryptedBase64Str =
// Base64.encodeBase64String(cipher.doFinal(plaintext.getBytes()));
// Fen段加密
for (int offset = 0; offset < plainBytes.length; offset += encryptBlock) {
// blockDa小: encryptBlock 或 剩Yu字节数
int inputLen = (plainBytes.length - offset);
if (inputLen > encryptBlock) {
inputLen = encryptBlock;
}
// De到分段加密结果
byte[] encryptedBlock = cipher.doFinal(plainBytes, offset, inputLen);
// Zhui加结果到输出buffer中
outbuf.write(encryptedBlock);
}
// Ru果是Base64编码,则返回Base64Bian码后的数组
if (useBase64Code) {
return encodeBase64String(outbuf.toByteArray()).getBytes(
charset);
} else {
return outbuf.toByteArray(); // ciphertext
}
}
/**
* RSAJie
*
* @param cryptedBytes
* Dai解密信息
* @return byte[]
* @throws Exception
*/
public byte[] decryptRSA(byte[] cryptedBytes, boolean useBase64Code,
String charset) throws Exception {
byte[] data;
// Ru果是Base64编码的话,则要Base64Jie
if (useBase64Code) {
data = decodeBase64(new String(cryptedBytes, charset));
} else {
data = cryptedBytes;
}
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
int decryptBlock = KEYBIT / 8; // 256 bytes
int encryptBlock = decryptBlock - RESERVEBYTES; // 245 bytes
// Ji算分段解密的block数 (理论上应该Neng整除)
int nBlock = (data.length / decryptBlock);
// Shu出buffer, , 大小为nBlockGeencryptBlock
ByteArrayOutputStream outbuf = new ByteArrayOutputStream(nBlock
* encryptBlock);
cipher.init(Cipher.DECRYPT_MODE, localPrivKey);
// plaintext = new
// String(cipher.doFinal(Base64.decodeBase64(cryptedBase64Str)));
// Fen段解密
for (int offset = 0; offset < data.length; offset += decryptBlock) {
// blockDa小: decryptBlock 或 剩Yu字节数
int inputLen = (data.length - offset);
if (inputLen > decryptBlock) {
inputLen = decryptBlock;
}
// De到分段解密结果
byte[] decryptedBlock = cipher.doFinal(data, offset, inputLen);
// Zhui加结果到输出buffer中
outbuf.write(decryptedBlock);
}
outbuf.flush();
outbuf.close();
return outbuf.toByteArray();
}
/**
* RSAQian
*
* @param plainBytes
* Xu要签名的信息
* @return byte[]
* @throws Exception
*/
public byte[] signRSA(byte[] plainBytes, boolean useBase64Code,
String charset) throws Exception {
Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
signature.initSign(localPrivKey);
signature.update(plainBytes);
// Ru果是Base64编码的话,需要对签名后De数组以Base64编码
if (useBase64Code) {
return encodeBase64String(signature.sign())
.getBytes(charset);
} else {
return signature.sign();
}
}
/**
* Yan签操作
*
* @param plainBytes
* Xu要验签的信息
* @param signBytes
* Qian名信息
* @return boolean
*/
public boolean verifyRSA(byte[] plainBytes, byte[] signBytes,
boolean useBase64Code, String charset) throws Exception {
boolean isValid;
Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
signature.initVerify(peerPubKey);
signature.update(plainBytes);
// Ru果是Base64编码的话,需要对验签的Shu组以Base64解码
if (useBase64Code) {
isValid = signature.verify(decodeBase64(new String(
signBytes, charset)));
} else {
isValid = signature.verify(signBytes);
}
return isValid;
}
private String encodeBase64String(byte[] dataBytes) {
return Base64.encodeBase64(dataBytes) == null ? null : new String(Base64.encodeBase64(dataBytes), Charset.forName("UTF-8"));
}
private byte[] decodeBase64(String base64String) {
return Base64.decodeBase64(base64String == null ? null : base64String.getBytes(Charset.forName("UTF-8")));
}
public static void main(String[] args) throws Exception {
String plaintext = "Ni好,测试";
System.out.println("=====> init <=====");
RSAHelper cipher = RSAHelper.getInstance();
System.out.println("=====> sign & verify <=====");
// Qian
byte[] signBytes = cipher.signRSA(plaintext.getBytes("UTF-8"), false,
"UTF-8");
// Yan证签名
boolean isValid = cipher.verifyRSA(plaintext.getBytes("UTF-8"),
signBytes, false, "UTF-8");
System.out.println("isValid: " + isValid);
// Jia密和解密
System.out.println("=====> encrypt & decrypt <=====");
// Dui明文加密
byte[] cryptedBytes = cipher.encryptRSA(plaintext.getBytes("UTF-8"),
false, "UTF-8");
System.out.println(Convertor.byte2HexString(cryptedBytes));
// Dui密文解密
byte[] decryptedBytes = cipher.decryptRSA(cryptedBytes, false, "UTF-8");
System.out.println("decrypted: " + new String(decryptedBytes, "UTF-8"));
}
}
php java rsa加密有什么不同
PHP的RSA签名和验签方法
1. Qian名方法
openssl_sign($msg, $sign, $ key, OPENSSL_ALGO_SHA1);
$msg:Yao签名的字符串。
$sign:做好签Ming字符串。
不可以写成 $sign = openssl_sign($msg, $sign, $ key, OPENSSL_ALGO_SHA1);
$ key:Mi钥,密钥格式,必须为rsa_private_key.pemDe格式。
OPENSSL_ALGO_SHA1:Mi钥算法,如果与Java等交互,必须相互Pei对。
2. 验签方法
$result= openssl_verify($msg, $sign, $key);
$msg:Qian名的原字符串。
$sign:签名字Fu串。
$ key:密钥,密钥格式,Bi须为rsa_private_key.pemDe格式。
$result:验签结果;Wei1时,验签正确;其余失败。
nodejs RSA 怎么采用模数和指数的验签
代码如下:
var ursa = require(‘ursa’);
var HEX = “hex”;
var EXPONENT_HEX = “010001”;
var PSS_MODULUS_HEX =
“a2ba40ee07e3b2bd2f02ce227f36a195024486e49c19cb41bbbdfbba98b22b0e”+
“577c2eeaffa20d883a76e65e394c69d4b3c05a1e8fadda27edb2a42bc000fe88”+
“8b9b32c22d15add0cd76b3e7936e19955b220dd17d4ea904b1ec102b2e4de775”+
“1222aa99151024c7cb41cc5ea21d00eeb41f7c800834d2c6e06bce3bce7ea9a5”;
var pubFromComponents = ursa.createPublicKeyFromComponents(
new Buffer(PSS_MODULUS_HEX, HEX),
new Buffer(EXPONENT_HEX, HEX));
var key = pubFromComponents.toPublicPem().toString();console.log(key);
词条推荐
網軒 網眼 網漁具 網罭 網墜 蝄蜽 蝄像 誷冒 輞川 輞川圖 輞口 輞水 輞圖 輞幰 瀇滉 瀇洋 瀇瀁 魍魉 魍魉魑魅 魍魎 魍魎魑魅 魍魅 妄尘而拜 妄称 妄稱 妄诞 妄誕 妄动 妄動 妄断 妄见 妄見 妄匠 妄进 妄進 妄境 妄口 妄口巴舌 妄口拔舌 妄冒 妄男子 妄念 妄其 妄求 妄取 妄人 妄杀 妄殺 妄生穿凿 妄施
专题推荐
琌的意思及寓意 琌是什么意思 琌字的意思 绫波丽的日语台词 绫波丽经典语录 绫打头的成语 绫的句子 绫的四字成语 绫的组词和读音 绫缎的意思 绫开头的成语 绫罗绸缎的近义词是什么 绫罗绸缎的类似成语 绫罗绸缎的绫罗是什么意思 绫罗绸缎的绫组词 绫罗绸缎的钱意思 绫罗绸缎的意思和造句 绫罗绸缎的造句 绫罗绸缎结构相似的词语 绫罗绸缎类似的词 绫罗绸缎类似的词语 绫罗绸缎类型的词语 绫罗绸缎理解词语 绫罗绸缎是不是成语 绫罗绸缎是描写颜色的吗 绫罗绸缎是什么是成语 绫罗绸缎是什么意思啊 绫罗绸缎相近的成语 绫罗绸缎相似的词语 绫罗绸缎怎么造句