如何将 android PublicKey 转换为字符串并返回?
How can convert android PublicKey to string and back?
我正在尝试创建一个可以加密用户消息的应用程序。用户 Public 密钥需要作为字符串发布到服务器。我正在生成 Android KyeStore Public密钥,如下所示:
public static PublicKey getOrCreatePublicKey(String alias) throws GeneralSecurityException, IOException {
KeyStore keyStore = KeyStore.getInstance(ANDROID_PROVIDER);
keyStore.load(null);
if (!keyStore.containsAlias(alias) || keyStore.getCertificate(alias) == null) {
KeyGenParameterSpec spec = new KeyGenParameterSpec.Builder(
alias,
KeyProperties.PURPOSE_DECRYPT | KeyProperties.PURPOSE_ENCRYPT)
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_OAEP)
.setDigests(KeyProperties.DIGEST_SHA256,
KeyProperties.DIGEST_SHA512)
.build();
KeyPairGenerator generator = KeyPairGenerator.getInstance(KeyProperties.KEY_ALGORITHM_RSA, ANDROID_PROVIDER);
generator.initialize(spec);
generator.generateKeyPair();
}
return keyStore.getCertificate(alias).getPublicKey();
}
然后我尝试将 PublicKey 转换为字符串并返回 PublicKey,如下所示:
public static PublicKey stringToPublicKey(String publStr) {
PublicKey publicKey = null;
try {
byte[] data = Base64.decode(publStr, Base64.DEFAULT);
X509EncodedKeySpec spec = new X509EncodedKeySpec(data);
KeyFactory fact = KeyFactory.getInstance("RSA");
publicKey = fact.generatePublic(spec);
} catch (GeneralSecurityException e) {
e.printStackTrace();
}
return publicKey;
}
public static String publicKeyToString(PublicKey publ) {
String publicKeyString = null;
try {
KeyFactory fact = KeyFactory.getInstance("RSA");
X509EncodedKeySpec spec = fact.getKeySpec(publ,
X509EncodedKeySpec.class);
publicKeyString = Base64.encodeToString(spec.getEncoded(), Base64.DEFAULT);
} catch (GeneralSecurityException e) {
e.printStackTrace();
}
return publicKeyString;
}
然后我尝试使用 Public 和私钥加密和解密用户消息。
如果我不转换 Public 密钥,加密工作正常。但是,如果我将 Public Key 转换为字符串并返回 Public Key,加密将不再有效。
我究竟做错了什么?谢谢。
PublicKey publicKey1 = getOrCreatePublicKey("alias");
String publicKeyStr = publicKeyToString(publicKey1);
PublicKey publicKey2 = stringToPublicKey(publicKeyStr);
//this one works
String message = encrypt(str, publicKey1);
String decryptm = decrypt(message, privateKey);
//this one doesn't work
String message = encrypt(str, publicKey2);
String decryptm = decrypt(message, privateKey);
我已经替换了
KeyProperties.ENCRYPTION_PADDING_RSA_OAEP
和
KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1.
我也换了
密码密码=Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding");
和
密码密码=Cipher.getInstance("RSA/ECB/PKCS1Padding");
现在可以了。但是我还是不知道为什么第一次不行。
您的 publicKeyToString 函数运行很长。它不应该是在 "reverse" 中再次完成 stringToPublicKey 的所有步骤。我的意思是,您不必构造对象,您已经将 public 键作为对象。获取PublicKey转String基本上只需要一行
public static String publicKeyToString(PublicKey publ) {
String publicKeyString = Base64.encodeToString(publ.getEncoded(), 2);
return publicKeyString;
}
这应该输出一个与您的 stringToPublicKey 函数一起使用的字符串(我认为它是正确的)。
我正在尝试创建一个可以加密用户消息的应用程序。用户 Public 密钥需要作为字符串发布到服务器。我正在生成 Android KyeStore Public密钥,如下所示:
public static PublicKey getOrCreatePublicKey(String alias) throws GeneralSecurityException, IOException {
KeyStore keyStore = KeyStore.getInstance(ANDROID_PROVIDER);
keyStore.load(null);
if (!keyStore.containsAlias(alias) || keyStore.getCertificate(alias) == null) {
KeyGenParameterSpec spec = new KeyGenParameterSpec.Builder(
alias,
KeyProperties.PURPOSE_DECRYPT | KeyProperties.PURPOSE_ENCRYPT)
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_OAEP)
.setDigests(KeyProperties.DIGEST_SHA256,
KeyProperties.DIGEST_SHA512)
.build();
KeyPairGenerator generator = KeyPairGenerator.getInstance(KeyProperties.KEY_ALGORITHM_RSA, ANDROID_PROVIDER);
generator.initialize(spec);
generator.generateKeyPair();
}
return keyStore.getCertificate(alias).getPublicKey();
}
然后我尝试将 PublicKey 转换为字符串并返回 PublicKey,如下所示:
public static PublicKey stringToPublicKey(String publStr) {
PublicKey publicKey = null;
try {
byte[] data = Base64.decode(publStr, Base64.DEFAULT);
X509EncodedKeySpec spec = new X509EncodedKeySpec(data);
KeyFactory fact = KeyFactory.getInstance("RSA");
publicKey = fact.generatePublic(spec);
} catch (GeneralSecurityException e) {
e.printStackTrace();
}
return publicKey;
}
public static String publicKeyToString(PublicKey publ) {
String publicKeyString = null;
try {
KeyFactory fact = KeyFactory.getInstance("RSA");
X509EncodedKeySpec spec = fact.getKeySpec(publ,
X509EncodedKeySpec.class);
publicKeyString = Base64.encodeToString(spec.getEncoded(), Base64.DEFAULT);
} catch (GeneralSecurityException e) {
e.printStackTrace();
}
return publicKeyString;
}
然后我尝试使用 Public 和私钥加密和解密用户消息。
如果我不转换 Public 密钥,加密工作正常。但是,如果我将 Public Key 转换为字符串并返回 Public Key,加密将不再有效。 我究竟做错了什么?谢谢。
PublicKey publicKey1 = getOrCreatePublicKey("alias");
String publicKeyStr = publicKeyToString(publicKey1);
PublicKey publicKey2 = stringToPublicKey(publicKeyStr);
//this one works
String message = encrypt(str, publicKey1);
String decryptm = decrypt(message, privateKey);
//this one doesn't work
String message = encrypt(str, publicKey2);
String decryptm = decrypt(message, privateKey);
我已经替换了
KeyProperties.ENCRYPTION_PADDING_RSA_OAEP 和 KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1.
我也换了
密码密码=Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding");
和
密码密码=Cipher.getInstance("RSA/ECB/PKCS1Padding");
现在可以了。但是我还是不知道为什么第一次不行。
您的 publicKeyToString 函数运行很长。它不应该是在 "reverse" 中再次完成 stringToPublicKey 的所有步骤。我的意思是,您不必构造对象,您已经将 public 键作为对象。获取PublicKey转String基本上只需要一行
public static String publicKeyToString(PublicKey publ) {
String publicKeyString = Base64.encodeToString(publ.getEncoded(), 2);
return publicKeyString;
}
这应该输出一个与您的 stringToPublicKey 函数一起使用的字符串(我认为它是正确的)。