C# 如何手动设置p和q值?
我有加密的C代码,但我想给出我自己的p和q,我如何编辑它?例如,当我尝试给予时;手动p=11 q=5,不允许我在方法内部编辑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)),
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位。