密钥、公钥的字符串以文件形式保存和读取

项目中常常需要下载对方的公钥来做数字签名验证,公钥一般是不会变得,所以我们也只需要下载一次就可以,然后以文件形式保存;得到的公钥往往是一个字符串,以下代码是对公钥的保存和读取:

1、保存到e:/pubkey.dat文件中

  //pubKeyStr公钥字符串

  java.security.spec.X509EncodedKeySpec bobPubKeySpec = new java.security.spec.X509EncodedKeySpec(
     new BASE64Decoder().decodeBuffer(pubKeyStr));
   // RSA对称加密算法
   java.security.KeyFactory keyFactory;
   keyFactory = java.security.KeyFactory.getInstance("RSA");
   // 取公钥匙对象
   PublicKey publicKey = keyFactory.generatePublic(bobPubKeySpec);

   FileOutputStream fs_pubkey = new FileOutputStream("e:/pubkey.dat");
   fs_pubkey.write(publicKey.getEncoded());
   fs_pubkey.close();

 

2、读取

   File file = new File("e:/pubkey.dat");
   if (file.exists()) {//文件存在
   FileInputStream fsKey = new FileInputStream(file);
   BufferedInputStream bfsKey = new BufferedInputStream(fsKey);
   byte[] byteKey = new byte[bfsKey.available()];
   bfsKey.read(byteKey);
   bfsKey.close();
   X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(byteKey);

   KeyFactory keyFactory = KeyFactory.getInstance("RSA");
   PublicKey publicKey = keyFactory.generatePublic(pubKeySpec);}

转载于:https://www.cnblogs.com/stream1/archive/2012/05/30/2525971.html

以下是使用 OpenSSL 库在 C 语言生成 RSA 公私钥对,使用 BIO 对象并读取 PKCS#8 格式公钥字符串的代码示例: ```c #include <openssl/rsa.h> #include <openssl/pem.h> #include <openssl/bio.h> int main() { RSA *keypair = RSA_new(); BIGNUM *exponent = BN_new(); int bits = 2048; // 密钥位数 // 设置指数 BN_set_word(exponent, RSA_F4); // 生成密钥对 RSA_generate_key_ex(keypair, bits, exponent, NULL); // 写入私钥 BIO *bp = BIO_new(BIO_s_mem()); PEM_write_bio_RSAPrivateKey(bp, keypair, NULL, NULL, 0, NULL, NULL); BUF_MEM *buf; BIO_get_mem_ptr(bp, &buf); FILE *fp = fopen("private.pem", "wb"); fwrite(buf->data, 1, buf->length, fp); fclose(fp); BIO_free_all(bp); // 获取公钥 EVP_PKEY *pubkey = EVP_PKEY_new(); EVP_PKEY_assign_RSA(pubkey, keypair); // 写入 PKCS#8 格式公钥 bp = BIO_new(BIO_s_mem()); i2d_PublicKey_bio(bp, pubkey); BIO_get_mem_ptr(bp, &buf); fp = fopen("public.pkcs8", "wb"); fwrite(buf->data, 1, buf->length, fp); fclose(fp); BIO_free_all(bp); // 读取 PKCS#8 格式公钥字符串 char pubstr[2048] = {0}; fp = fopen("public.pkcs8", "rb"); fread(pubstr, 1, 2048, fp); fclose(fp); // 从字符串读取公钥 bp = BIO_new_mem_buf(pubstr, -1); EVP_PKEY *pubkey2 = d2i_PUBKEY_bio(bp, NULL); BIO_free_all(bp); // 比较公钥 if (EVP_PKEY_cmp(pubkey, pubkey2) == 1) { printf("Public key is the same.\n"); } else { printf("Public key is different.\n"); } return 0; } ``` 上述代码,`BIO_new` 函数用于创建内存型 BIO 对象,`BUF_MEM` 结构体用于获取内存型 BIO 对象的数据,`fwrite` 函数用于将字符串写入文件,`BIO_new_mem_buf` 函数用于将字符串创建为内存型 BIO 对象,从而得到公钥对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值