使用iOS生成的公钥的C#RSA加密



我试图在iOS和C#之间设置RSA加密通道。

在iOS中,公钥是使用安全框架生成的。

代码段,

NSData* tag = [@"com.x.x.x" dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary* attributes =
@{ (id)kSecAttrKeyType:               (id)kSecAttrKeyTypeRSA,
(id)kSecAttrKeySizeInBits:         @1024,
(id)kSecPrivateKeyAttrs:
@{ (id)kSecAttrIsPermanent:    @YES,
(id)kSecAttrApplicationTag: tag,
},
};
CFErrorRef error = NULL;
SecKeyRef privateKey = SecKeyCreateRandomKey((__bridge CFDictionaryRef)attributes,
&error);
if (!privateKey) {
NSError *err = CFBridgingRelease(error); 
// Handle the error. . .
}
SecKeyRef publicKey = SecKeyCopyPublicKey(privateKey);

结果:"MIGJAoGBAMIt95f4xaP7vYV/+Hdyb4DK0oKvw495PrRYG3nsYgVP7zlBE/rTN6Nmt69W9d0nGefuRlJFIr9TA8vlJmqTus6uXEasBuEjzH7vM7HQeAK6i8qEbVy0T+Uuq+16yy059NL7i/VWljVE6rqTntDUELmbIwNBwj6oBuL1z3SnFoMjAgMBAAE="

在C#中,我试图使用上面生成的公钥来加密数据。

C#代码段:

const string pKey = "MIGJAoGBAMIt95f4xaP7vYV/+Hdyb4DK0oKvw495PrRYG3nsYgVP7zlBE/rTN6Nmt69W9d0nGefuRlJFIr9TA8vlJmqTus6uXEasBuEjzH7vM7HQeAK6i8qEbVy0T+Uuq+16yy059NL7i/VWljVE6rqTntDUELmbIwNBwj6oBuL1z3SnFoMjAgMBAAE=";
byte[] publicKeyBytes = Convert.FromBase64String(pKey);              
var stream = new MemoryStream(publicKeyBytes);
Asn1Object asn1Object = Asn1Object.FromStream(stream);

我正在评估asn1Object并手动复制ModulusExponent,在这种情况下是

BigInteger modulus = new BigInteger("136357523654993073600337541886612209461653649830596179928022807129764638978058775447065286245685299741061442447812373893408612622888251899821604061796495147997132112844250946475016809624300789149318149170549447812758865778797994482272574020014042899233361299524505365746896235948770695552862804390518105473827");
BigInteger exponent = new BigInteger("65537");

然后我可以使用生成公钥

AsymmetricKeyParameter param = new RsaKeyParameters(false, modulus, exponent);
RsaKeyParameters rsaKeyParameters = (RsaKeyParameters)param;
RSAParameters rsaParameters = new RSAParameters();
rsaParameters.Modulus = rsaKeyParameters.Modulus.ToByteArrayUnsigned();
rsaParameters.Exponent = rsaKeyParameters.Exponent.ToByteArrayUnsigned();  
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.ImportParameters(rsaParameters);

Q1.是否有任何方法可以遍历ans1Object并获得相应的数据?

Q2.有没有办法在C#中直接使用iOS生成的Base64(公钥(?

Q3.我需要将相同格式的公钥发送回客户端。

附言:如有任何指导和帮助,我们将不胜感激。

So So So,

经过这么多的研究和100年代的堆栈溢出选项卡。

我可以在C#中使用iOS生成的公钥,使用Bouncy castle进行加密。

pkey : Public Key given from client

下面的代码段:

const string pKey = "MIGJAoGBAMIt95f4xaP7vYV/+Hdyb4DK0oKvw495PrRYG3nsYgVP7zlBE/rTN6Nmt69W9d0nGefuRlJFIr9TA8vlJmqTus6uXEasBuEjzH7vM7HQeAK6i8qEbVy0T+Uuq+16yy059NL7i/VWljVE6rqTntDUELmbIwNBwj6oBuL1z3SnFoMjAgMBAAE=";
byte[] publicKeyBytes = Convert.FromBase64String(pKey);
var stream = new MemoryStream(publicKeyBytes);
Asn1Object asn1Object = Asn1Object.FromStream(stream);
Asn1Encodable asn1Sequence = asn1Object;   
AlgorithmIdentifier algorithmIdentifier = new 
AlgorithmIdentifier(PkcsObjectIdentifiers.IdRsaesOaep);  
SubjectPublicKeyInfo subjectPublicKeyInfo = new 
SubjectPublicKeyInfo(algorithmIdentifier, asn1Sequence);   
AsymmetricKeyParameter asymmetricKeyParameter2 = 
PublicKeyFactory.CreateKey(subjectPublicKeyInfo);    
RsaKeyParameters rsaKeyParameters = 
(RsaKeyParameters)asymmetricKeyParameter2;
RSAParameters rsaParameters = new RSAParameters();
rsaParameters.Modulus = rsaKeyParameters.Modulus.ToByteArrayUnsigned();
rsaParameters.Exponent = rsaKeyParameters.Exponent.ToByteArrayUnsigned();
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.ImportParameters(rsaParameters);
string test = "John snow is the true king";
byte[] encbyte = rsa.Encrypt(Encoding.UTF8.GetBytes(test), RSAEncryptionPadding.Pkcs1);
string encrt = Convert.ToBase64String(encbyte);

附言:到目前为止,代码还没有得到很好的优化,所以请忽略这一点。

最新更新