RSA 使用 iOS 和 C# 实现

Posted

技术标签:

【中文标题】RSA 使用 iOS 和 C# 实现【英文标题】:RSA implement with iOS and C# 【发布时间】:2019-05-07 22:51:13 【问题描述】:

我们需要从 RSA 密钥中获取模数和指数。我使用以下方法创建了我的公钥。请让我知道我们如何从中获取模数和指数部分。我已经读过这个post。

 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);

// 现在我想要这个公钥的模数和指数

已编辑:- 我也将base64字符串发送到服务器,但我们面临着从base64字符串中找到公钥引用的相当大的问题。如果有人用c#做过,你也可以帮助我们

c#代码sn-p

const string pKey = "-----key-----" 
byte[] publicKeyBytes = Convert.FromBase64String(pKey);            
var stream = new MemoryStream(publicKeyBytes);
Asn1Object asn1Object = Asn1Object.FromStream(stream);

现在我们需要无法解析的公钥组件。任何帮助都会很棒

【问题讨论】:

我也将base64字符串发送到服务器,但是我们面临着从base64字符串中找到公钥引用的相当大的问题。如果有人用 c# 做过,你也可以帮助我们 【参考方案1】:

在C#上你可以使用这种方式实现加密,

        const string publicKey = "MIGJAoGBAMIt95f4xaP7vYV/+Hdyb4DK0oKvw495PrRYG3nsYgVP7zlBE/rTN6Nmt69W9d0nGefuRlJFIr9TA8vlJmqTus6uXEasBuEjzH7vM7HQeAK6i8qEbVy0T+Uuq+16yy059NL7i/VWljVE6rqTntDUELmbIwNBwj6oBuL1z3SnFoMjAgMBAAE="; //generated on ios
        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);

【讨论】:

以上是关于RSA 使用 iOS 和 C# 实现的主要内容,如果未能解决你的问题,请参考以下文章

iOS小技能:RSA签名算法和加密算法的实现

iOS小技能:RSA签名算法和加密算法的实现

iOS小技能:RSA签名算法和加密算法的实现

C#中RSA加密解密和签名与验证的实现

使用模数和公共指数的 C# RSA 加密

C#实现RSA加密和解密详解