RSA体系 c++/java相互进行加签验签--转
在web开发中,采用RSA公钥密钥体系自制ukey,文件证书登陆时,普遍的做法为:在浏览器端采用c++ activex控件,使用 c++的第三库openssl进行RAS加签操作,在服务器端采用java对客户端的签名进行验签操作。这就涉及到c++ openssl和java之间交互加签验签对客户端身份进行验证的过程。
如果你通过搜索查到我这边文章,相信你一定发现,采用openssl加签后的 数据,在java端却验签不成功,使用openssl验签可以通过。问题在于openssl的公钥发在服务端转换成java RSA 公钥时有问题,openssl的公钥格式里附加了它自己的一些额外信息。所以在服务端java构造自己的pubkey时必须先剔除openssl的特有信息。
例如如果我么采用openssl生成 modulus size 为1024, exponent为65537 的公钥秘钥对---RSA_generate_key(1024, 65537, NULL, NULL);那么我们在java端通过openssl的公钥构造java格式的公钥时,我们就必须采用如下方式获得modulus ,然后采用java的方式构造公钥,进行验签操作。
private static byte[] getModulus(byte[] pkData, int begin){
byte[] modData = new byte[128] ;
byte[] ss = {pkData[0],pkData[1],pkData[2],pkData[3]};
for(int i = 0, y = begin; i < 128; i++,y++){
modData[i] = pkData[y];
}
return modData;
}
/**
* 从openssl中提起相关的128为的公钥数据
* @param b64Str
* @return
*/
private static byte[] get128PkData(String b64Str){
String pk = b64Str.replace("-----BEGIN RSA PUBLIC KEY-----", "");//剔除前面的信息
pk = pk.replace("-----END RSA PUBLIC KEY-----", "");// 剔除后面的信息
byte[] pkData = Base64.decode(pk);
return getModulus(pkData, 7);//下标从7开始,获得128 bytes的modulus
}
/** 如果你问我里边到底加了一些什么信息,我也不知道,我是从下标1开始不断测试,才得出应该从下标7开始获取modulus值 ***/
/**
* 由1024位的公钥转换成x509格式的公钥
* @param modData
* @return
* @throws Exception
*/
private static PublicKey getPublicKey(byte[] modData) throws Exception{
KeyFactory keyf = KeyFactory.getInstance("RSA");
RSAPublicKeySpec pubKeySpec = new RSAPublicKeySpec(new BigInteger(modData), new BigInteger("65537"));
RSAPublicKey pk = (RSAPublicKey) keyf.generatePublic(pubKeySpec);
// 解密由base64编码的公钥,并构造X509EncodedKeySpec对象
java.security.spec.X509EncodedKeySpec bobPubKeySpec = new java.security.spec.X509EncodedKeySpec(
pk.getEncoded());
return keyf.generatePublic(bobPubKeySpec);
}
至于openssl我就不再做介绍,网上有很多资料,而且它本身的文档也很齐全
在后面附上一些相关的类, SignProvider.java 端负责公钥转换和加签验签 Base64.java负责64为编码 fcOpenSslRef.rar---Openssl相关类
注:本人对c++也不熟,所以上面的一些c++代码只做参考。
原文:http://www.chlusoft.com/tech/347.jhtml
RSA体系 c++/java相互进行加签验签--转的更多相关文章
- Java实现RSA密钥对并在加解密、加签验签中应用的实例
一.项目结构 二.代码具体实现 1.密钥对生成的两种方式:一种生成公钥私文件,一种生成公钥私串 KeyPairGenUtil.java package com.wangjinxiang.genkey. ...
- java RSA 加签验签【转】
引用自: http://blog.csdn.net/wangqiuyun/article/details/42143957/ java RSA 加签验签 package com.testdemo.co ...
- RSA加密解密及RSA加签验签
RSA安全性应用场景说明 在刚接触RSA的时候,会混淆RSA加密解密和RSA加签验签的概念.简单来说加密解密是公钥加密私钥解密,持有公钥(多人持有)可以对数据加密,但是只有持有私钥(一人持有)才可以解 ...
- RSA加密解密与加签验签
RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.1987年7月首次在美国公布 ...
- 微信小程序(17)-- RSA加密 解密 加签 验签
RSA加密 解密 加签 验签 /** * 注:区分RSA私钥的类型,有pkcs1和pkcs8.pkcs8格式的私钥主要用于Java中 pkcs1格式: -----BEGIN RSA PRIVATE K ...
- Python rsa公私钥生成 rsa公钥加解密(分段加解密)-私钥加签验签实战
一般现在的SAAS服务提供现在的sdk或api对接服务都涉及到一个身份验证和数据加密的问题.一般现在普遍的做法就是配置使用非对称加密的方式来解决这个问题,你持有SAAS公司的公钥,SAAS公司持有你的 ...
- Java使用数字证书加密通信(加解密/加签验签)
本文中使用的Base64Utils.java可参考:http://www.cnblogs.com/shindo/p/6346618.html 证书制作方法可参考:http://www.cnblogs. ...
- RSA密钥生成、加密解密、签名验签
RSA 非对称加密公钥加密,私钥解密 私钥签名,公钥验签 下面是生成随机密钥对: //随机生成密钥对 KeyPairGenerator keyPairGen = null; try { keyPair ...
- ruby md5加签验签方法
# md5签名def md5_sign(data,key) return OpenSSL::Digest::MD5.hexdigest(data+key)end # md5验签def md5_veri ...
随机推荐
- yii2源码学习笔记(三)
组件(component),是Yii框架的基类,实现了属性.事件.行为三类功能,如果需要事件和行为的功能,需要继承该类. yii\base\Component代码详解 <?php /** * @ ...
- 矩形嵌套问题-ACM集训
参考 http://blog.csdn.net/xujinsmile/article/details/7861412 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形 ...
- PuTTY + Xming 远程使用 Linux GUI
from http://www.zw1840.com/blog/zw1840/2008/10/putty-xming-linux-gui.html 在家里的PC上用VMWare做了一个Oracle E ...
- UnixODBC
UnixODBC下载安装地址:http://www.unixodbc.org/ DOWNLOAD Distribution Format unixODBC is currently availible ...
- 跨平台的zip文件压缩处理,支持压缩解压文件夹
根据minizip改写的模块,需要zlib支持 输出的接口: #define RG_ZIP_FILE_REPLACE 0 #define RG_ZIP_FILE_APPEND 1 //压缩文件夹目录, ...
- bzoj2818
我们先穷举素数p然后令y>x 这样问题就是求这个gcd(x,y)=p (1<=x<y=n)不难发现必须y=kp k∈N* 当y=p时,易知个数为φ(1)当y=2p 个数为φ(2), ...
- Apache HTTP Server mod_session_dbd 远程安全漏洞(CVE-2013-2249)
漏洞版本: Apache 2.4.2 漏洞描述: BUGTRAQ ID: 61379 CVE(CAN) ID: CVE-2013-2249 Apache HTTP Server是开源HTTP服务器. ...
- -_-#setTimeout与setInterval
你真的了解setTimeout和setInterval吗? 存在一个最小的时钟间隔 有关零秒延迟,此回调将会放到一个能立即执行的时段进行触发.JavaScript 代码大体上是自顶向下执行,但中间穿插 ...
- 【转】Java删除文件夹和文件
原文网址:http://kxjhlele.iteye.com/blog/323657 以前在javaeye看到过关于Java操作文件的一篇文章,写的很好,但找了半天也没找到,就把找到底几篇文章整理一下 ...
- 【转】EditText大小(长宽)的多种设置方式----不错
原文网址:http://orgcent.com/android-edittext-ems-layout-minwidth-maxheight/ EditText大小的设置有多种方式,要想对每种方式运用 ...