Я пытаюсь настроить канал шифрования RSA между iOS и C #.
В iOS открытый ключ генерируется с использованием Security Framework.
Фрагмент кода,
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);
Iя оцениваю asn1Object
и вручную копирую Modulus
и Exponent
, что в данном случае равно
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.Есть ли способ напрямую использовать сгенерированный iOS Base64 (открытый ключ) в C #?
Q3.Мне нужно отправить открытый ключ в том же формате обратно клиенту.
PS Любые рекомендации и помощь будут высоко оценены.