openssl RSA 签名

hades09 发布于 2014/12/30 10:22
阅读 1K+
收藏 0

现在有个用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(priPKCS8);

			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();
 }

搞了几天了,没有眉目。

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



加载中
返回顶部
顶部