银行给了,公钥私钥指数和模数,如下是java的签名验签的方法:
公钥指数:String publicExponent = “00010001”
私钥指数:String privateExponent = “”
模数:String modulus = “”
public String sign(final String plainData) throws Exception {
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
RSAPrivateKeySpec keySpec = new RSAPrivateKeySpec(new BigInteger(modulus, 16),
new BigInteger(privateExponent, 16));
PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
Signature signature = Signature.getInstance("SHA1withRSA");
signature.initSign(privateKey);
signature.update(plainData.getBytes("UTF-8"));
return Base64.getEncoder().encodeToString(signature.sign());
}
public boolean verify(final String plainData, final String sign) throws Exception {
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
RSAPublicKeySpec keySpec = new RSAPublicKeySpec(new BigInteger(modulus, 16),
new BigInteger(publicExponent, 16));
PublicKey publicKey = keyFactory.generatePublic(keySpec);
final Signature signature = Signature.getInstance("SHA1withRSA");
signature.initVerify(publicKey);
signature.update(plainData.getBytes("UTF-8"));
return signature.verify(Base64.getDecoder().decode(sign));
}
怎么转化成c#,我现在卡在怎么将公私钥指数+模数,生成公私钥,然后签名,我试了好几种方式,都不行。。有知道的大神求问
java test
static String publicExponent = "10001"; static String privateExponent = "78bf10f3b7274ddd04da85a2b737dc524f717e765c16515f25479cf7db4627b116da3198fd54ef3732795cb9164029acd8e6c76d6bfa27bd9f433ad88ee7c2bd"; static String modulus = "bddf972718f690b4d9e85de3a3a854ed4b72640914fb1073d07319687dbc8fc2b7b5701cce4cd47bdffd343a0e5b2762e572be07aa5c8d1201a035cc440c77a5"; static { // generateKeyPair(); } /** * 生成一对密钥 */ static void generateKeyPair() { try { KeyPairGenerator gen = KeyPairGenerator.getInstance("RSA"); gen.initialize(512); KeyPair pair = gen.generateKeyPair(); // rsa生成一对公私钥 RSAPublicKey publicKey = (RSAPublicKey) pair.getPublic(); RSAPrivateKey privateKey = (RSAPrivateKey) pair.getPrivate(); BigInteger md = publicKey.getModulus(); BigInteger pe = publicKey.getPublicExponent(); BigInteger _md = privateKey.getModulus(); BigInteger re = privateKey.getPrivateExponent(); assertEquals(md,_md); publicExponent = pe.toString(16); privateExponent = re.toString(16); modulus = md.toString(16); System.out.println("publicExponent:" + publicExponent); System.out.println("privateExponent:" + privateExponent); System.out.println("modulus:" + modulus); } catch (Exception igr) { igr.printStackTrace(); } } public static String sign(final String plainData) throws Exception { KeyFactory keyFactory = KeyFactory.getInstance("RSA"); RSAPrivateKeySpec keySpec = new RSAPrivateKeySpec(new BigInteger(modulus, 16), new BigInteger(privateExponent, 16)); PrivateKey privateKey = keyFactory.generatePrivate(keySpec); Signature signature = Signature.getInstance("SHA1withRSA"); signature.initSign(privateKey); signature.update(plainData.getBytes("UTF-8")); return Base64.getEncoder().encodeToString(signature.sign()); } public static boolean verify(final String plainData, final String sign) throws Exception { KeyFactory keyFactory = KeyFactory.getInstance("RSA"); RSAPublicKeySpec keySpec = new RSAPublicKeySpec(new BigInteger(modulus, 16), new BigInteger(publicExponent, 16)); PublicKey publicKey = keyFactory.generatePublic(keySpec); final Signature signature = Signature.getInstance("SHA1withRSA"); signature.initVerify(publicKey); signature.update(plainData.getBytes("UTF-8")); return signature.verify(Base64.getDecoder().decode(sign)); } /** * @param args * @throws Exception */ public static void main(String[] args) throws Exception { String plainData = "ni hao ,今天天气不错"; String sign = sign(plainData); System.out.println(sign);//ENRI/kCR/KCrQGyh9zf70Ce5RQtOg/9CJonPohvUgMUAOXeffVwHQCMZN/FxMf8+iTQUdOiDnm3RS9OWTwlUtQ== System.out.println(verify(plainData, sign)); }
c# Using
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Math;
using Org.BouncyCastle.Security;
c# Test
static String publicExponent = "10001"; static String privateExponent = "78bf10f3b7274ddd04da85a2b737dc524f717e765c16515f25479cf7db4627b116da3198fd54ef3732795cb9164029acd8e6c76d6bfa27bd9f433ad88ee7c2bd"; static String modulus = "bddf972718f690b4d9e85de3a3a854ed4b72640914fb1073d07319687dbc8fc2b7b5701cce4cd47bdffd343a0e5b2762e572be07aa5c8d1201a035cc440c77a5"; static void Main(string[] args) { string plainData = "ni hao ,今天天气不错"; string signText = sign(plainData); Console.WriteLine(signText); Console.WriteLine(verify(plainData, signText));//ENRI/kCR/KCrQGyh9zf70Ce5RQtOg/9CJonPohvUgMUAOXeffVwHQCMZN/FxMf8+iTQUdOiDnm3RS9OWTwlUtQ== // Console.WriteLine(); } static string sign( string plainData) { ISigner signer = SignerUtilities.GetSigner("SHA1withRSA"); RsaKeyParameters key = new RsaKeyParameters(true, new BigInteger(modulus,16), new BigInteger(privateExponent,16)); signer.Init(true, key); byte[] plainBytes = Encoding.UTF8.GetBytes(plainData); signer.BlockUpdate(plainBytes, 0, plainBytes.Length); byte[] signBytes = signer.GenerateSignature(); return Convert.ToBase64String(signBytes); } static bool verify(string plainData, string sign) { ISigner signer = SignerUtilities.GetSigner("SHA1withRSA"); RsaKeyParameters key = new RsaKeyParameters(false, new BigInteger(modulus,16), new BigInteger(publicExponent,16)); signer.Init(false, key); byte[] signBytes = Convert.FromBase64String(sign); byte[] plainBytes = Encoding.UTF8.GetBytes(plainData); signer.BlockUpdate(plainBytes, 0, plainBytes.Length); bool ret = signer.VerifySignature(signBytes); return ret; }
需要引用什么dll呢
@EApple: 已经知道了,十分感谢,我纠结了2天了。。。好多方法都试过了,分不多,真的十分感谢
【引用的:
http://www.bouncycastle.org/csharp/index.html
下载bin的zip文件。
工程添加引用“BouncyCastle.Crypto.dll”】