如何从 Xamarin for Android 密钥存储中生成的密钥对获取指数/模数



我有Xamarin(android(应用程序。我需要生成公钥/私钥对,然后为其他应用程序逻辑获取指数和模数。在我的其他本机 Android 应用程序中,我已经实现了这个 - 代码正在生产中并且工作正常 - 这是缩短的 JAVA 版本:

// Android key store
KeyStore store = KeyStore.getInstance("AndroidKeyStore");
store.load(null);
// Key generation params
KeyGenParameterSpec.Builder keySpecBuilder =
            new KeyGenParameterSpec.Builder("my-cert", KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY)
                .setDigests(KeyProperties.DIGEST_NONE, KeyProperties.DIGEST_SHA256)
                .setSignaturePaddings(KeyProperties.SIGNATURE_PADDING_RSA_PKCS1)
                .setKeySize(2048);
// Generate key pair
KeyPairGenerator kpg = KeyPairGenerator.getInstance(KeyProperties.KEY_ALGORITHM_RSA, store.getProvider());              
kpg.initialize(keySpecBuilder.build());
KeyPair keyPair = kpg.generateKeyPair();
// Get public key
RSAPublicKey publicKey = (RSAPublicKey)keyPair.getPublic();
// Get exponent and modulus
BigInteger exp = publicKey.getPublicExponent();
BigInteger mod = publicKey.getModulus();

当我尝试将完全相同的代码写入 C#/Xamarin 时,我遇到了从生成的键中获取指数/模数的问题。也不是公钥,私钥也没有这些属性。

问题:如果我生成了 Java.Security.KeyPair 对象,如何在 Xamarin-C# 中获取指数和模数(请参阅下面的 C# 示例(:

// Android key store
var store = KeyStore.GetInstance("AndroidKeyStore");
store.Load(null);
// Key generation params
var keyGenParameterSpecBuilder =
                new KeyGenParameterSpec.Builder("my-cert", KeyStorePurpose.Sign | KeyStorePurpose.Verify)
                .SetDigests(KeyProperties.DigestNone, KeyProperties.DigestSha256)
                .SetSignaturePaddings(KeyProperties.SignaturePaddingRsaPkcs1)
                .SetKeySize(2048);
// Generate key pair                
var kpg = KeyPairGenerator.GetInstance(KeyProperties.KeyAlgorithmRsa, _keyStore.Provider); 
kpg.Initialize(keyGenParameterSpecBuilder.Build());
var keyPair = kpg.GenKeyPair();
var publicKey = keyPair.Public; // has type of IPublicKey
// How to get PublicExponent and Modulus?
// IPublicKey has no needed properties
// Not possible to cast to IRSAPublicKey, which has needed properties
var rsaPublicKey = publicKey as IRSAPublicKey; // = null

必须使用JavaCast方法将IPublicKey转换为IRSAPublicKey类型。然后指数和模量可以通过属性访问。

var rsaPublicKey = publicKey.JavaCast<IRSAPublicKey>();
var e = rsaPublicKey.PublicExponent;
var m = rsaPublicKey.Modulus;

最新更新