解决方案 »

  1.   


                          byte[] msg = "中国人民解放军".getBytes("UTF-8");
    // 用证书的公钥加密
    CertificateFactory cff = CertificateFactory.getInstance("X.509");
    FileInputStream fis1 = new FileInputStream(
    "E://TestKey2.cer"); // 证书文件
    java.security.cert.Certificate cf = cff.generateCertificate(fis1);
    PublicKey pk1 = cf.getPublicKey(); // 得到证书文件携带的公钥
    Cipher c1 = Cipher.getInstance("RSA/ECB/PKCS1Padding"); // 定义算法:RSA
    c1.init(Cipher.ENCRYPT_MODE, pk1);
    byte[] msg1 = c1.doFinal(msg); // 加密后的数据 // 用证书的私钥解密 - 该私钥存在生成该证书的密钥库中
    FileInputStream fis2 = new FileInputStream(
    "E://TestStore");
    KeyStore ks = KeyStore.getInstance("JKS"); // 加载证书库
    char[] kspwd = "000000".toCharArray(); // 证书库密码
    char[] keypwd = "000000".toCharArray(); // 证书密码
    ks.load(fis2, kspwd); // 加载证书
    PrivateKey pk2 = (PrivateKey) ks.getKey("TestKey2", keypwd); // 获取证书私钥
    fis2.close();
    Cipher c2 = Cipher.getInstance("RSA/ECB/PKCS1Padding");
    c2.init(Cipher.DECRYPT_MODE, pk2);
    byte[] msg2 = c2.doFinal(msg1); // 解密后的数据 System.out.println(new String(msg2, "UTF8")); // 将解密数据转为字符串
      

  2.   

    RSA这么重要的算法哪个语言都有实现代码的,网上一大堆,关键还是怎么把密钥转成 .NET 格式,如下: private static String getRSAPrivateKeyAsNetFormat(byte[] encodedPrivkey) {
    try {
    StringBuffer buff = new StringBuffer(1024); PKCS8EncodedKeySpec pvkKeySpec = new PKCS8EncodedKeySpec(
    encodedPrivkey);
    KeyFactory keyFactory = KeyFactory.getInstance("RSA");
    RSAPrivateCrtKey pvkKey = (RSAPrivateCrtKey) keyFactory
    .generatePrivate(pvkKeySpec); buff.append("<RSAKeyValue>");
    buff.append("<Modulus>"
    + Base64.encode(removeMSZero(pvkKey.getModulus()
    .toByteArray())) + "</Modulus>"); buff.append("<Exponent>"
    + Base64.encode(removeMSZero(pvkKey.getPublicExponent()
    .toByteArray())) + "</Exponent>"); buff.append("<P>"
    + Base64.encode(removeMSZero(pvkKey.getPrimeP()
    .toByteArray())) + "</P>"); buff.append("<Q>"
    + Base64.encode(removeMSZero(pvkKey.getPrimeQ()
    .toByteArray())) + "</Q>"); buff.append("<DP>"
    + Base64.encode(removeMSZero(pvkKey.getPrimeExponentP()
    .toByteArray())) + "</DP>"); buff.append("<DQ>"
    + Base64.encode(removeMSZero(pvkKey.getPrimeExponentQ()
    .toByteArray())) + "</DQ>"); buff.append("<InverseQ>"
    + Base64.encode(removeMSZero(pvkKey.getCrtCoefficient()
    .toByteArray())) + "</InverseQ>"); buff.append("<D>"
    + Base64.encode(removeMSZero(pvkKey.getPrivateExponent()
    .toByteArray())) + "</D>");
    buff.append("</RSAKeyValue>"); return buff.toString().replaceAll("[ \t\n\r]", "");
    } catch (Exception e) {
    System.err.println(e);
    return null;
    }
    } private static String getRSAPublicKeyAsNetFormat(byte[] encodedPrivkey) {
    try {
    StringBuffer buff = new StringBuffer(2048); X509EncodedKeySpec pvkKeySpec = new X509EncodedKeySpec(
    encodedPrivkey);
    KeyFactory keyFactory = KeyFactory.getInstance("RSA");
    // RSAPrivateCrtKey pvkKey = (RSAPrivateCrtKey) keyFactory
    // .generatePrivate(pvkKeySpec);
    RSAPublicKey pvkKey = (RSAPublicKey) keyFactory
    .generatePublic(pvkKeySpec);
    buff.append("<RSAKeyValue>");
    buff.append("<Modulus>"
    + Base64.encode(removeMSZero(pvkKey.getModulus()
    .toByteArray())) + "</Modulus>");
    buff.append("<Exponent>"
    + Base64.encode(removeMSZero(pvkKey.getPublicExponent()
    .toByteArray())) + "</Exponent>");
    buff.append("</RSAKeyValue>");
    return buff.toString().replaceAll("[ \t\n\r]", "");
    } catch (Exception e) {
    System.err.println(e);
    return null;
    }
    }
      

  3.   

    你可能理解错了, 不是要把密匙转成.Net 。只是要用.Net解密而已。
    也就是接收到byte的参数然后通过程序解密 只是这个过程,我不太清楚.net是要如何解密。
      

  4.   

    只要解密看这个
    http://msdn.microsoft.com/zh-cn/library/system.security.cryptography.rsacryptoserviceprovider.aspx
      

  5.   

    只要解密看这个
    http://msdn.microsoft.com/zh-cn/library/system.security.cryptography.rsacryptoserviceprovider.aspx嗯 谢谢, 已经找到了, 另外就是问一下 这边有人用java做了一个文件,没有文件类型,让读取里面的私钥。
    具体的读取方式在上面已经贴出来了源码。
    我这边需要用私钥解密,但是得不到私钥。
      

  6.   

    麻烦给看一下这块java 代码怎么能改成net的。 
      

  7.   

    你可能理解错了, 不是要把密匙转成.Net 。只是要用.Net解密而已。
    也就是接收到byte的参数然后通过程序解密 只是这个过程,我不太清楚.net是要如何解密。解密之前难道不要把密钥转成 .NET 的吗, 不然怎么用 .NET 解密.
      

  8.   

    你可能理解错了, 不是要把密匙转成.Net 。只是要用.Net解密而已。
    也就是接收到byte的参数然后通过程序解密 只是这个过程,我不太清楚.net是要如何解密。解密之前难道不要把密钥转成 .NET 的吗, 不然怎么用 .NET 解密.
    你的意思是需要java设置私钥的时候设置为.net之后才可以使用.net解密吗?