C# 如何手动设置p和q值?

C# 如何手动设置p和q值?,c#,encryption,rsa,C#,Encryption,Rsa,我有加密的C代码,但我想给出我自己的p和q,我如何编辑它?例如,当我尝试给予时;手动p=11 q=5,不允许我在方法内部编辑 private static RSAParameters Create(byte[] p, byte[] q, byte[] exponent, byte[] modulus) { var addlParameters = GetFullPrivateParameters( p: new BigInteger(CopyAndReverse(p)),

我有加密的C代码,但我想给出我自己的p和q,我如何编辑它?例如,当我尝试给予时;手动p=11 q=5,不允许我在方法内部编辑

private static RSAParameters Create(byte[] p, byte[] q, byte[] exponent, byte[] modulus)
{
    var addlParameters = GetFullPrivateParameters(
        p: new BigInteger(CopyAndReverse(p)),
        q: new BigInteger(CopyAndReverse(q)),
        e: new BigInteger(CopyAndReverse(exponent)),
        modulus: new BigInteger(CopyAndReverse(modulus)));

    return new RSAParameters
    {
        P = p,
        Q = q,
        Exponent = exponent,
        Modulus = modulus,
        D = addlParameters.D,
        DP = addlParameters.DP,
        DQ = addlParameters.DQ,
        InverseQ = addlParameters.InverseQ,
    };
}

private static RSAParameters GetFullPrivateParameters(BigInteger p, BigInteger q, BigInteger e, BigInteger modulus)
{
    var n = p * q;
    var phiOfN = n - p - q + 1; // OR: (p - 1) * (q - 1);

    var d = ModInverse(e, phiOfN);
    //Assert.Equal(1, (d * e) % phiOfN);

    var dp = d % (p - 1);
    var dq = d % (q - 1);

    var qInv = ModInverse(q, p);
    //Assert.Equal(1, (qInv * q) % p);

    return new RSAParameters
    {
        D = CopyAndReverse(d.ToByteArray()),
        DP = CopyAndReverse(dp.ToByteArray()),
        DQ = CopyAndReverse(dq.ToByteArray()),
        InverseQ = CopyAndReverse(qInv.ToByteArray()),
    };
}
[编辑] 我更改了
Create()
,如下所示

  private static RSAParameters Create(byte[] p, byte[] q, byte[] exponent, byte[] modulus)
        {
            //set number to byte array
            int intValueP = 51;
            int intValueQ = 7;
            byte[] intBytes = BitConverter.GetBytes(intValueP);
            byte[] intBytes2 = BitConverter.GetBytes(intValueQ);
            var addlParameters = GetFullPrivateParameters(
                p: new BigInteger(CopyAndReverse(intBytes)),
                q: new BigInteger(CopyAndReverse(intBytes2)),
                e: new BigInteger(CopyAndReverse(exponent)),
                modulus: new BigInteger(CopyAndReverse(modulus)));
但是它给了我错误(见图)

该方法出现错误,表示转换过程中出现问题,请提供帮助

public static BigInteger ModInverse(BigInteger a, BigInteger n)
    {
        BigInteger t = 0, nt = 1, r = n, nr = a;

        if (n < 0)
        {
            n = -n;
        }

        if (a < 0)
        {
            a = n - (-a % n);
        }

        while (nr != 0)
        {
            var quot = r / nr;

            var tmp = nt; nt = t - quot * nt; t = tmp;
            tmp = nr; nr = r - quot * nr; r = tmp;
        }

        if (r > 1) throw new ArgumentException(nameof(a) + " is not convertible.");
        if (t < 0) t = t + n;
        return t;
    }
公共静态BigInteger ModInverse(BigInteger a,BigInteger n)
{
大整数t=0,nt=1,r=n,nr=a;
if(n<0)
{
n=-n;
}
if(a<0)
{
a=n-(-a%n);
}
而(nr!=0)
{
var quot=r/nr;
var tmp=nt;nt=t-quot*nt;t=tmp;
tmp=nr;nr=r-quot*nr;r=tmp;
}
如果(r>1)抛出新的ArgumentException(nameof(a)+“不可转换”);
如果(t<0)t=t+n;
返回t;
}

我不明白您看到的是什么问题<代码>参数是一个。你就不能做一个吗?@John我不明白,你能告诉我你的意思吗?你的代码中似乎有它,新的参数{P=P,等等。-你看到了什么问题?“当我试着手动给出;P=11 q=5时,它不允许我在方法内部编辑。”-我不明白。你为什么不能编辑它?@John我过去常做
var p=new biginger(61)
例如,但我不知道如何对p执行相同的逻辑,p是一个字节数组。任何.NET RSA类在导入时都可以接受的最小大小是384位的模。因此p和q都需要大于2**191。11短188位,5短189位。