如何从 Xamarin 中为 Android 密钥库生成的密钥对获取 Exponent/Modulus

How to get Exponent/Modulus from KeyPair generated in Xamarin for Android key store

我有 Xamarin (android) 应用程序。 我需要生成 public/private 密钥对,然后为其他应用程序逻辑获取指数和模数。 在我的其他本机 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 编写完全相同的代码时,我因从生成的密钥中获取 Exponent/Modulus 的问题而停止。 public 密钥和私钥都没有这些属性。

问题:如果我生成了 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;