RSA加解密:

1024位的证书,加密时最大支持117个字节,解密时为128;
2048位的证书,加密时最大支持245个字节,解密时为256。

加密时支持的最大字节数:证书位数/8 -11(比如:2048位的证书,支持的最大加密字节数:2048/8 - 11 = 245)

.NET中的RSA加密算法为了提高安全性,在待加密数据前要添加一些随机数,因此,使用.NET中的RSA加密算法一次最多加密117字节数据(多于117字节需要拆分成多段分别加密再连接起来),经过加密后得到一个长度为128字节的加密数据。

RSA实际可加密的明文长度最大也是1024bits,但问题就来了:如果小于这个长度怎么办?就需要进行padding,因为如果没有padding,用户无法区分解密后内容的真实长度,字符串之类的内容问题还不大,以0作为结束符,但对二进制数据就很难理解,因为不确定后面的0是内容还是内容结束符。只要用到padding,那么就要占用实际的明文长度,于是才有117字节的说法。我们一般使用的padding标准有NoPPadding、OAEPPadding、PKCS1Padding等,其中PKCS#1建议的padding就占用了11个字节。如果大于这个长度怎么办?很多算法的padding往往是在后边的,但PKCS的padding则是在前面的,此为有意设计,有意的把第一个字节置0以确保m的值小于n。这样,128字节(1024bits)-减去11字节正好是117字节,但对于RSA加密来讲,padding也是参与加密的,所以,依然按照1024bits去理解,但实际的明文只有117字节了。

C#代码实现:

RSA 填充模式:PKCS1PADDING
分片大小: 加密244、解密256

internal static string GetEncryptedMsg(string xml)
{
byte[] encryptedData;
using (var rsa = GetPublicKey(Configs.PublicKeyFilePath))
{
var plainData = Encoding.UTF8.GetBytes(xml);
using (var plaiStream = new MemoryStream(plainData))
{
using (var crypStream = new MemoryStream())
{
var offSet = ;
var inputLen = plainData.Length;
for (var i = ; inputLen - offSet > ; offSet = i*)
{
if (inputLen - offSet > )
{
var buffer = new Byte[];
plaiStream.Read(buffer, , );
var cryptograph = rsa.Encrypt(buffer, false);
crypStream.Write(cryptograph, , cryptograph.Length);
}
else
{
var buffer = new Byte[inputLen - offSet];
plaiStream.Read(buffer, , inputLen - offSet);
var cryptograph = rsa.Encrypt(buffer, false);
crypStream.Write(cryptograph, , cryptograph.Length);
}
++i;
}
crypStream.Position = ;
encryptedData = crypStream.ToBytes();
}
}
}
return BitConverter.ToString(encryptedData).Replace("-", string.Empty);
} internal static byte[] GetDecryptedMsg(byte[] encryptedBytes)
{
using (var rsa = GetPrivateKey(Configs.PrivateKeyFilePath, Configs.PrivateKeyPasswd))
{
byte[] decryptedData;
using (var plaiStream = new MemoryStream(encryptedBytes))
{
using (var decrypStream = new MemoryStream())
{
var offSet = ;
var inputLen = encryptedBytes.Length;
for (var i = ; inputLen - offSet > ; offSet = i * )
{
if (inputLen - offSet > )
{
var buffer = new Byte[];
plaiStream.Read(buffer, , );
var decrypData = rsa.Decrypt(buffer, false);
decrypStream.Write(decrypData, , decrypData.Length);
}
else
{
var buffer = new Byte[inputLen - offSet];
plaiStream.Read(buffer, , inputLen - offSet);
var decrypData = rsa.Decrypt(buffer, false);
decrypStream.Write(decrypData, , decrypData.Length);
}
++i;
}
decrypStream.Position = ;
decryptedData = decrypStream.ToBytes();
}
}
return decryptedData;
}
}

C# RSA 分段加解密的更多相关文章

  1. RSA 分段加解密【解决“不正确的长度”的异常】

    RSA 是常用的非对称加密算法.最近使用时却出现了“不正确的长度”的异常,研究发现是由于待加密的数据超长所致. .NET Framework 中提供的 RSA 算法规定: 待加密的字节数不能超过密钥的 ...

  2. Java RSA 分段加解密

    RSA加解密: 1024位的证书,加密时最大支持117个字节,解密时为128:2048位的证书,加密时最大支持245个字节,解密时为256. 加密时支持的最大字节数:证书位数/8 -11(比如:204 ...

  3. 偏前端 + rsa加解密 + jsencrypt.min.js--(新增超长字符分段加解密)

    <html> <head> <title>JavaScript RSA Encryption</title> <meta charset=&quo ...

  4. RSA签名,加解密处理核心文件

    import java.io.ByteArrayOutputStream; import java.io.UnsupportedEncodingException; import java.secur ...

  5. [Python3] RSA的加解密和签名/验签实现 -- 使用pycrytodome

    Crypto 包介绍: pycrypto,pycrytodome 和 crypto 是一个东西,crypto 在 python 上面的名字是 pycrypto 它是一个第三方库,但是已经停止更新,所以 ...

  6. php rsa 非对称加解密类

    <?php header("Content-Type: text/html;charset=utf-8"); /* 生成公钥.私钥对,私钥加密的内容能通过公钥解密(反过来亦可 ...

  7. Python rsa公私钥生成 rsa公钥加解密(分段加解密)-私钥加签验签实战

    一般现在的SAAS服务提供现在的sdk或api对接服务都涉及到一个身份验证和数据加密的问题.一般现在普遍的做法就是配置使用非对称加密的方式来解决这个问题,你持有SAAS公司的公钥,SAAS公司持有你的 ...

  8. python实现RSA加密和签名以及分段加解密的方案

    1.前言 很多朋友在工作中,会遇到一些接口使用RSA加密和签名来处理的请求参数,那么遇到这个问题的时候,第一时间当然是找开发要加解密的方法,但是开发给加解密代码,大多数情况都是java,c++,js等 ...

  9. 使用非对称算法RSA实现加解密和使用签名算法SHA1WithRSA、MD5withRSA生成签名以及验签

    不啰嗦,直接上源码 package com.hudai.platform.manager.util; import java.io.ByteArrayOutputStream; import java ...

随机推荐

  1. 比较Java数组,ArrayList,LinkedList,Vector 性能比较

    public class PerformanceTester { public static final int TIMES=100000; public static abstract class ...

  2. Spring注意事项(各部分理解)

    (1),每一个bean属性,就是一个普通的java类. 类有属性,有方法,如何交给容器管理.(注解的方式,xml方式配置) (2),通过Bean来实例化对象的方式 1.通过构造器(一般是无参的默认构造 ...

  3. JavaScript实现DDoS攻击原理,以及保护措施。

    DDos介绍 最普遍的攻击是对网站进行分布式拒绝服务(DDoS)攻击.在一个典型的DDoS攻击中,攻击者通过发送大量的数据到服务器,占用服务资源.从而达到阻止其他用户的访问. 如果黑客使用JavaSc ...

  4. font-size:100%有什么作用

    h1,h2,h3,h4,h5,h6 {font-size:100%;font-weight:normal;} input,select,textarea,samp {font-size:100%;} ...

  5. JavaScript与有限状态机

    有限状态机(Finite-state machine)是一个非常有用的模型,可以模拟世界上大部分事物. 简单说,它有三个特征: * 状态总数(state)是有限的. * 任一时刻,只处在一种状态之中. ...

  6. IE浏览器下常见的CSS兼容问题

    目录 [1]宽高bug [2]边框bug [3]盒模型bug[4]列表项bug [5]浮动bug [6]定位bug [7]表单bug 宽高bug [1]IE6-浏览器下子元素能撑开父级设置好的宽高 & ...

  7. 在office2010怎么样删除图片背景

    在网络上找到一张图片,当你只想要某些部分,但不想要图片的背景的时候,应该怎么办呢,当然你可以借助专业的图片处理工具,如:PS,然后对于大多数没有接触过此软件的同学来说要将背景去掉,实属不易,有没有简单 ...

  8. 使用Javascript监控前端相关数据

    项目开发完成外发后,没有一个监控系统,我们很难了解到发布出去的代码在用户机器上执行是否正确,所以需要建立前端代码性能相关的监控系统. 所以我们需要做以下的一些模块: 一.收集脚本执行错误 functi ...

  9. php的memcache和memcached扩展区别

    老生长谈的问题了.我这里就整理一下. memcache的文档在:http://pecl.php.net/package/memcache memcached的文档在:http://pecl.php.n ...

  10. Redis代码阅读之Hacking Strings

    Hacking Strings The implementation of Redis strings is contained in sds.c ( sds stands for Simple Dy ...