首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BouncyCastle RSA实现

BouncyCastle RSA实现
EN

Code Review用户
提问于 2014-09-03 15:00:45
回答 1查看 4.8K关注 0票数 5

这是我实现的1024位(可以更改) RSA。我做错什么了吗?

代码语言:javascript
复制
public class Rsa:IEncryption
{
    public AsymmetricCipherKeyPair Keys { get;private set; }

    private readonly Pkcs1Encoding _engine;

    public Rsa()
    {
        Keys = GenerateKeys();
        _engine = new Pkcs1Encoding(new RsaEngine());
    }

    public byte[] Encrypt(byte[] buffer)
    {
        return Encrypt(buffer, 0, buffer.Length);
    }

    public byte[] Decrypt(byte[] buffer)
    {
        return Decrypt(buffer, 0, buffer.Length);
    }

    public byte[] Encrypt(byte[] buffer, int offSet, int length)
    {
        return RsaProcessor(buffer, offSet, length, Keys.Public);
    }

    public byte[] Decrypt(byte[] buffer, int offSet, int length)
    {
        return RsaProcessor(buffer, offSet, length,Keys.Private);
    }

    private byte[] RsaProcessor(byte[] data,int offset,int length, AsymmetricKeyParameter key)
    {
        _engine.Init(!key.IsPrivate, key);

        var blockSize = _engine.GetInputBlockSize();

        var result = new List<byte>();
        for (var i = offset; i < offset+length; i += blockSize)
        {
            var currentSize = Math.Min(blockSize, offset + length - i);
            result.AddRange(_engine.ProcessBlock(data, i, currentSize));
        }
        return result.ToArray();
    }

    public static AsymmetricCipherKeyPair GenerateKeys()
    {
        var rsaKeyParams = new RsaKeyGenerationParameters(BigInteger.ProbablePrime(512, new Random()),
                                                          new SecureRandom(), 1024, 25); //Unsure about the certinaty parameter
        var keyGen = new RsaKeyPairGenerator();
        keyGen.Init(rsaKeyParams);

        return keyGen.GenerateKeyPair();
    }
}
EN

回答 1

Code Review用户

回答已采纳

发布于 2014-11-13 09:25:23

风格

  • 几乎所有参数和方法的命名都很好。
  • RsaProcessor()听起来像个名词。根据命名指南,你应该用动词或动词短语来命名你的方法。也许像Process()这样的简单名称在这里就足够了。

RsaProcessor()方法中,我建议将其介绍为Boolean forEncryption。就这样,这一行的意思

_engine.Init(!key.IsPrivate,key);

会很明显的。

代码语言:javascript
复制
private byte[] Process(byte[] data, int offset, int length, AsymmetricKeyParameter key)
{
    Boolean forEncryption = !key.IsPrivate;

    _engine.Init(forEncryption , key);

    var blockSize = _engine.GetInputBlockSize();

    var result = new List<byte>();
    for (var i = offset; i < offset+length; i += blockSize)
    {
        var currentSize = Math.Min(blockSize, offset + length - i);
        result.AddRange(_engine.ProcessBlock(data, i, currentSize));
    }
    return result.ToArray();
}

否则,您的代码看起来很好。

关于您的Unsure about the certinaty parameter,请参阅https://stackoverflow.com/a/3087161/2655508

RSA密钥生成需要素数。然而,不可能产生绝对素数。和其他密码库一样,BC使用可能的素数。确定性表示你有多确定你希望这个数字是素数。任何超过80的东西都会大大减慢密钥生成速度。

票数 3
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/61860

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档