首页 > 其他分享 >RSA加解密

RSA加解密

时间:2024-12-11 09:55:49浏览次数:8  
标签:string BlockSize 加解密 RSA Length provider new byte

无废话,直接上工具类

using System.Security.Cryptography;
using System.Text;

namespace DZCloudServer.Core.Util
{
    public class EncryptUtil
    {
        /*
          RSA 加密算法
          */

        /// <summary>
        /// 获取RSA 密钥
        /// 下标 0 为 私钥
        /// 下标 1 为 公钥
        /// </summary>
        /// <returns></returns>
        public static string[] GetRSAKey()
        {
            RSACryptoServiceProvider provider = new();
            string privatekey = provider.ToXmlString(true);
            string publickey = provider.ToXmlString(false);
            return [privatekey, publickey];
        }

        /// <summary>
        /// 私钥加密
        /// </summary>
        /// <param name="plaintext"></param>
        /// <param name="privateKey"></param>
        /// <returns></returns>
        public static string RSAEncrypt(string plaintext, string privateKey)
        {
            using RSACryptoServiceProvider provider = new();
            provider.FromXmlString(privateKey);

            byte[] PlaintextData = Encoding.UTF8.GetBytes(plaintext);
            int MaxBlockSize = provider.KeySize / 8 - 11;    //加密块最大长度限制

            if (PlaintextData.Length <= MaxBlockSize)
                return Convert.ToBase64String(provider.Encrypt(PlaintextData, false));

            using MemoryStream PlaiStream = new(PlaintextData);
            using MemoryStream CrypStream = new();
            byte[] Buffer = new byte[MaxBlockSize];
            int BlockSize = PlaiStream.Read(Buffer, 0, MaxBlockSize);

            while (BlockSize > 0)
            {
                byte[] ToEncrypt = new byte[BlockSize];
                Array.Copy(Buffer, 0, ToEncrypt, 0, BlockSize);

                byte[] Cryptograph = provider.Encrypt(ToEncrypt, false);
                CrypStream.Write(Cryptograph, 0, Cryptograph.Length);

                BlockSize = PlaiStream.Read(Buffer, 0, MaxBlockSize);
            }
            return Convert.ToBase64String(CrypStream.ToArray(), Base64FormattingOptions.None);
        }

        /// <summary>
        /// 公钥解密
        /// </summary>
        /// <param name="ciphertext"></param>
        /// <param name="publicKey"></param>
        /// <returns></returns>
        public static string RSADecrypt(string ciphertext, string publicKey)
        {
            using RSACryptoServiceProvider provider = new();
            provider.FromXmlString(publicKey);

            byte[] CiphertextData = Convert.FromBase64String(ciphertext);
            int MaxBlockSize = provider.KeySize / 8;    //解密块最大长度限制

            if (CiphertextData.Length <= MaxBlockSize)
                return Encoding.UTF8.GetString(provider.Decrypt(CiphertextData, false));

            using MemoryStream CrypStream = new(CiphertextData);
            using MemoryStream PlaiStream = new();
            byte[] Buffer = new byte[MaxBlockSize];
            int BlockSize = CrypStream.Read(Buffer, 0, MaxBlockSize);

            while (BlockSize > 0)
            {
                byte[] ToDecrypt = new byte[BlockSize];
                Array.Copy(Buffer, 0, ToDecrypt, 0, BlockSize);

                byte[] Plaintext = provider.Decrypt(ToDecrypt, false);
                PlaiStream.Write(Plaintext, 0, Plaintext.Length);

                BlockSize = CrypStream.Read(Buffer, 0, MaxBlockSize);
            }
            return Encoding.UTF8.GetString(PlaiStream.ToArray());
        }

        /// <summary>
        /// SHA256 提取字符串Hash
        /// </summary>
        /// <returns></returns>
        public static string SHA256Encryptor(string message)
        {
            byte[] bytes = Encoding.UTF8.GetBytes(message);
            byte[] hash = SHA256.HashData(bytes);

            var builder = new StringBuilder();
            for (int i = 0; i < hash.Length; i++)
            {
                builder.Append(hash[i].ToString("x2"));
            }
            return builder.ToString();
        }
    }
}

 

标签:string,BlockSize,加解密,RSA,Length,provider,new,byte
From: https://www.cnblogs.com/lucienbao/p/18598685/rsa_util

相关文章

  • XCVM1302-3HSEVFVB1369通过业界领先的 DDR 内存接口实现高数据吞吐量 - AMD Versal Pr
    XCVM1302-2MLIVSVF1369XCVM1302-2MSEVSVF1369XCVM1302-2MSIVFVB1369XCVM1302-2MSIVSVF1369XCVM1302-3HSEVFVB1369明佳达Versal自适应SoC兼具可编程逻辑和加速引擎的灵活处理能力,以及先进的内存和接口技术,可为各类应用实现定制化、强大的异构加速。VersalPrime系列是基......
  • COMP 250 BFS traversal
    FinalProjectCOMP250Fall2024posted:Wednesday,Dec.4,2024due:SundayDec.15,2024,at23:59forachancetoreceiveMastery,ORFriday,Dec.20,2024at23:59GeneralInstructionsSubmissioninstructions–Pleasenotethatthesubmissiondeadlinefo......
  • 攻防世界-baigeiRSA2
    ⭕考察内容1、非标准RSA加密算法2、逆元求解3、因式分解(yafu)一、题目给出一串代码,大概看一眼是类似RSA的加密算法,但是其n的选取并非2个素数的乘积,而是5个素数的乘积,所以并不是标准的RSA加密。再看一眼文件,发现给出了n和e二、解题1、因数分解由于n仅有96位,所以尝试使......
  • Java和.Net互相使用RSA加密时的问题和处理方法
    前言我们产品是使用JAVA语言开发的,有个供第三方获取Token的接口,过程大概就是第三方先调一个注册接口,获取一个RSA公钥,然后用通过公钥加密后的一些认证信息调用获取Token的接口,如果信息无误,则发放Token。前段时间就遇到了对方是使用.Net进行开发的系统,在第一步获取公钥时没用问题,......
  • window.crypto.subtle 实现非对称加密RSA-OAEP
    使用window.crypto.subtle,可以实现非对称加密(也称为公钥加密)。非对称加密使用一对密钥:公钥用于加密数据,私钥用于解密数据。以下是一个示例,演示如何使用window.crypto.subtle实现非对称加密和解密:生成密钥对首先,生成一个RSA密钥对:asyncfunctiongenerateKeyPair(){r......
  • c# - java公私钥 转 c# net 公私钥做 RSA 加解密操作
    1.背景java和c#语言的公私钥格式是不同的,需要专门转换后才可以使用2.c#工具类usingSystem;usingSystem.Security.Cryptography;usingSystem.Text;usingOrg.BouncyCastle.Crypto.Parameters;usingOrg.BouncyCastle.Security;namespaceHypj.Logic.NCAPI{pu......
  • RSA公钥系统(二)
    \(\mathrm{RSA}\)公钥系统(二)\(\mathrm{RSA}\)密钥生成、加密和解密步骤BobAlice密钥生成选择私密的质数$p$和$q$选择加密指数$e$使得$\text{gcd}(e,(p-1)(q-1))=1$公布$N=pq$和$e$\(~\)加密\(~\)选择明文$m$使用Bob的公......
  • RSA公钥系统(一)
    \(\mathrm{RSA}\)公钥系统(一)定理1模\(pq\)情形的“欧拉”公式费马小定理在\(m=pq\)时的推广,这是在密码学应用中最重要的情况。设$p$和$q$是不同的素数,且设$g=\gcd(p-1,q-1)$。那么对于所有满足$\gcd(a,pq)=1$的$a$,有:\[a^{\frac{(p-1......
  • 11Labs 推出 Conversational AI,可定制交互式语音智能体;Recall.ai:视频会议智能体通用 A
       开发者朋友们大家好: 这里是「RTE开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(Real-TimeEngagement)领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编......
  • 【基于Nginx配置https、wss】基于反向代理服务器部署SSL证书:个人测试证书(原免费证书)DV
    文章目录引言ISSL证书购买II基于反向代理服务器或者中间件配置部署SSL证书【推荐】Nginx的HTTP模块案例1:Nginx配置https案例2:nginx配置websocket支持wss流程域名和IP的映射配置(域名的DNS信息配置)服务器的外网IP和NGINX内网IP的映射防火墙放心NGINX监听的......