zoukankan      html  css  js  c++  java
  • RSA加密

    加密原理

    RSA加密演算法:http://zh.wikipedia.org/wiki/RSA%E5%8A%A0%E5%AF%86%E6%BC%94%E7%AE%97%E6%B3%95

    用实例给新手讲解RSA加密算法:http://www.cfca.com.cn/zhishi/wz-012.htm

    应用

    java程序使用生成一个RSA生成一对秘钥,Net程序要使用私钥对消息签名,发送给Java端。

    怎么在net中读取PKCS#8 私钥并签名?

    最简单使用外部组件

    System.Security.Cryptography, BouncyCastle, OpenSSL.Net and Chilkat RSA

    用Security.Cryptography ,需要net3.5以上的框架

    byte[] dataToSign = Encoding.UTF8.GetBytes("Data to sign");
    using (CngKey signingKey = CngKey.Import(pkcs8PrivateKey, CngKeyBlobFormat.Pkcs8PrivateBlob))
      using (RSACng rsa = new RSACng(signingKey))
      {
        rsa.SignatureHashAlgorithm = CngAlgorithm.MD5;
        return rsa.SignData(dataToSign);
      }
    

    BouncyCastle

            /// <summary>
            /// 获取数据签名
            /// </summary>
            /// <param name="source">数据</param>
            /// <param name="keyPath">私钥文件路径</param>
            /// <returns>签名后的信息</returns>
            public static string GetSignString(string data, string keyPath)
            {
                if (string.IsNullOrEmpty(data))
                {
                    return string.Empty;
                }
    
                byte[] dataKey = File.ReadAllBytes(keyPath);
                var key = PrivateKeyFactory.CreateKey(dataKey);
                ISigner sig = SignerUtilities.GetSigner("MD5withRSA");
    
                /* Populate key */
                sig.Init(true, key);
    
                /* Get the bytes to be signed from the string */
                var bytes = Encoding.UTF8.GetBytes(data);
    
                /* Calc the signature */
                sig.BlockUpdate(bytes, 0, bytes.Length);
                byte[] signature = sig.GenerateSignature();
    
                /* Base 64 encode the sig so its 8-bit clean */
                //var signedstring = Convert.ToBase64String(signature);
    
                return signature.ToBase64();
            }
    

      OpenSSL

    byte[] msg = System.Text.Encoding.ASCII.GetBytes("text to encrypt");
    OpenSSL.Crypto.RSA rsa = new OpenSSL.Crypto.RSA();
    byte[]result = rsa.PrivateEncrypt(msg, OpenSSL.Crypto.RSA.Padding.None);
    Console.WriteLine(Convert.ToBase64String(result));
    

      

     NET采用的加密填充标准是PKCS1Padding,由于java的rsa默认的加密没有使用填充算法,导致采用同样的秘钥加密的结果都不一样,其实java同样支持这一填充标准

    //进行加密  参数“RSA/ECB/PKCS1Padding”,代表和.NET用相同的填充算法
            Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");     
           cipher.init(Cipher.ENCRYPT_MODE, publicKey);     
           byte[] enBytes = cipher.doFinal(str_m.getBytes());     
           String s = (new BASE64Encoder()).encodeBuffer(enBytes);  
           System.out.println("加密结果为:" + s);  
    

      

  • 相关阅读:
    【C++17】std::optional

    【GDB 】GDB基本命令
    【二叉树系列 | 01】二叉树遍历
    【coredump | 01】coredump的阐述
    【C++ Template | 06】std::enable_if和SFINAE
    std::dclval 使用教程
    系统设计实践(03)- Instagram社交服务
    系统设计实践(02)- 文本存储服务
    系统设计实践(01)
  • 原文地址:https://www.cnblogs.com/50614090/p/3557842.html
Copyright © 2011-2022 走看看