android - 如何将 RSA 公钥转换为字符串,反之亦然?
问题描述
我想在我的应用程序中实现端到端加密,并且我希望我的公钥是一个字符串,以便我可以将它发送到服务器。请告诉我一种将公钥转换为字符串的方法,反之亦然。
解决方案
您的主要问题似乎是“将公钥转换为字符串的 java 代码,反之亦然”,这可以通过几行代码来完成。
完整的示例代码生成一个 RSA 密钥对,获取公钥的编码形式(作为字节数组),并以 Base64 编码将其编码为字符串。编码是通过 Android util 类完成的。然后字符串需要被传输到服务器,解码为一个字节数组,这个字节数组运行到一个“重新生成”公钥的密钥工厂 - 瞧。
请注意,代码没有异常处理,仅用于教育目的。
输出:
Convert RSA public key into a string an dvice versa
publicKey: Sun RSA public key, 2048 bits
params: null
modulus: 18853651626448533042344052742185586831509096183921137436644620443732807152716528158465416708071104899767862289783079092216042499687784322092232163872332358586822678596223733228124113017356896219191227134298362353552882770945818159114272146532048929436504145362418430766823867890113522564795700689158702507402243560009550536419065620409534494384621580364502393563063483223294632627903706549112325066113361455750410642281763368591922729105346933211850575970566025026523917327761707615319008741255611490792106558703015066844972642677443110535667601315009551275389632601989979561472926080344790824117481932026867279062677
public exponent: 65537
publicKeyString: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlVmFPS+dIDcJILVZMM9hdQwEiLcHx7SVYF5gOrakPH7ZzilcOjWYcR47qktQAUu97JbLu3h3WPmm1nkgSXU1lVBoqc8pA1BHmzdvMK61A/F77nspDce0QqH5f5kQvYcuQrl+cCUvaTI/3/WBWwRIO2xGKMKRIgiBWDN/HVsqYU2O2pAJnLKQbz9NkkfGNVdzn4H21hi0shCVWCpt80zZkn0gm3oWtCGHOnyszXUOiw7inAdGkNGiZRyiFOUmFNRKLIYM3WiyU1NRGVrjto9NH/E53JdgSyBEu7kkWMLJqNuwj+DNQFu3Qq5VrNxwWggrwhFG+K0y0+Ed+scT003mlQIDAQAB
publicKeyServer: Sun RSA public key, 2048 bits
params: null
modulus: 18853651626448533042344052742185586831509096183921137436644620443732807152716528158465416708071104899767862289783079092216042499687784322092232163872332358586822678596223733228124113017356896219191227134298362353552882770945818159114272146532048929436504145362418430766823867890113522564795700689158702507402243560009550536419065620409534494384621580364502393563063483223294632627903706549112325066113361455750410642281763368591922729105346933211850575970566025026523917327761707615319008741255611490792106558703015066844972642677443110535667601315009551275389632601989979561472926080344790824117481932026867279062677
public exponent: 65537
代码:
import android.util.Base64;
import java.security.*;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.X509EncodedKeySpec;
public class Main {
public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeySpecException {
System.out.println("Convert RSA public key into a string an dvice versa");
// generate a RSA key pair
KeyPairGenerator keygen = KeyPairGenerator.getInstance("RSA");
keygen.initialize(2048, new SecureRandom());
KeyPair keyPair = keygen.generateKeyPair();
PrivateKey privateKey = keyPair.getPrivate();
PublicKey publicKey = keyPair.getPublic();
System.out.println("publicKey: " + publicKey);
// get encoded form (byte array)
byte[] publicKeyByte = publicKey.getEncoded();
// Base64 encoded string
String publicKeyString = Base64.encodeToString(publicKeyByte, Base64.NO_WRAP);
System.out.println("publicKeyString: " + publicKeyString);
// ... transport to server
// Base64 decoding to byte array
byte[] publicKeyByteServer = Base64.decode(publicKeyString, Base64.NO_WRAP);
// generate the publicKey
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKeyServer = (PublicKey) keyFactory.generatePublic(new X509EncodedKeySpec(publicKeyByteServer));
System.out.println("publicKeyServer: " + publicKeyServer);
}
}
推荐阅读
- transactions - 关系数据库:究竟什么是“脏写”?如果他们不被允许会发生什么?
- statistics - Mikrotik NPS。如何收集有关 VPN 连接的统计信息?
- vue.js - 在 Quasar 中移除(或隐藏)全选复选框表格组件
- windows - 用于安装字体系列的 Powershell 脚本
- javascript - 如何从网站获取 api 数据,它显示 TypeError 消息
- spring - 在重写 url 路径的反向代理后面的 Vaadin Flow 应用程序中的导航
- android - 使用代码时活动页面加载缓慢
- python - 如何在 urllib3.ProxyManager 中访问 proxy_url\auth
- c++ - c ++错误:'{'标记之前的预期类名
- python - 使用 PyQt5 创建用于读写的多线程