如何从 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;
我有 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;