免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6550 | 回复: 2
打印 上一主题 下一主题

[C] openssl RSA 签名问题 [复制链接]

论坛徽章:
1
技术图书徽章
日期:2014-04-25 13:04:43
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-12-30 10:40 |只看该作者 |倒序浏览
现在有个用Java签名过的字符串,签名方式跟支付宝的方式类似。

1.openssl生成公私钥对openssl req -x509 -out public_key.der -outform der -new -newkey rsa:1024-keyout private_key.pem 生成私钥:private_key.pem公钥:public_key.der 2.将private_key.pem转换成PKCS8Padding格式openssl pkcs8 -topk8 -inform PEM -in private_key.pem -outform PEM -nocrypt返回一串字符如:


取出-----BEGIN PRIVATEKEY-----和-----END PRIVATEKEY-----之间的字符保存,做为解密的私钥串。 3.将生成的公钥DER文件BASE64编码openssl base64 -in public_key.der生成的字符串做为IOS的公钥 4.从已有的私钥中,导出android使用的公钥openssl rsa -in private_key.pem -pubout -out rsa_public_key.pem
以下程序代码是签名的逻辑

public static final String SIGN_ALGORITHMS = "SHA1WithRSA";
public static String sign(String content, String privateKey) {
                String charset = "utf-8";
                try {
                        PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(Base64.decode(privateKey));
                        KeyFactory keyf = KeyFactory.getInstance("RSA";
                        PrivateKey priKey = keyf.generatePrivate(priPKCS;

                        java.security.Signature signature = java.security.Signature.getInstance(SIGN_ALGORITHMS);

                        signature.initSign(priKey);
                        signature.update(content.getBytes(charset));

                        byte[] signed = signature.sign();

                        return Base64.encode(signed);
                } catch (Exception e) {
                        e.printStackTrace();
                }

                return null;
        }
现在的问题是我需要用C语言的服务端做验签,想到的是用openssl实现Java中下面程序的功能。



public static boolean verify(String content, String sign, String publicKey) {
try {
KeyFactory keyFactory = KeyFactory.getInstance("RSA";
byte[] encodedKey = Base64.decode(publicKey);
PublicKey pubKey = keyFactory.generatePublic(new X509EncodedKeySpec(encodedKey));


java.security.Signature signature = java.security.Signature.getInstance(SIGN_ALGORITHMS);


signature.initVerify(pubKey);
signature.update(content.getBytes("utf-8");

byte[] signBytes = Base64.decode(sign);
System.out.println(signBytes.length);
boolean bverify = signature.verify(signBytes);
return bverify;


} catch (Exception e) {
e.printStackTrace();
}
搞了几天了,没有眉目。

不知道哪位大神有搞过,还请不吝赐教?


论坛徽章:
0
2 [报告]
发表于 2015-02-27 13:43 |只看该作者
本帖最后由 pengyou41 于 2015-02-27 13:44 编辑

请问你这个问题解决了么,我也遇到了同样的问题了,就是用C语言实现验签,能不能把解决方法贴出来看看啊,谢谢回复 1# qqlizhifeng


   

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
3 [报告]
发表于 2015-02-27 16:01 |只看该作者
qqlizhifeng 发表于 2014-12-30 10:40
现在有个用Java签名过的字符串,签名方式跟支付宝的方式类似。

1.openssl生成公私钥对openssl req -x50 ...

openssl既然提供了签名,就必然提供验签,你找找吧,符合X509都是可互操作的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP