public static String decryptByPrivateKey(String encryptedDataStr, PrivateKey priKey) throws Exception { //获取密钥长度,生成解密长度 KeyFactory keyF = KeyFactory.getInstance(priKey.getAlgorithm()); RSAPrivateKeySpec keySpec = keyF.getKeySpec(priKey, RSAPrivateKeySpec.class); BigInteger prime = keySpec.getModulus(); int maxDecryptBlock = prime.toString(2).length()/8; //私钥解密 Cipher cipher = Cipher.getInstance(RSA); cipher.init(Cipher.DECRYPT_MODE, priKey); byte[] encryptedData = Base64.getDecoder().decode(encryptedDataStr); int inputLen = encryptedData.length; ByteArrayOutputStream out = new ByteArrayOutputStream(); int offSet = 0; byte[] cache; int i = 0; // 对数据分段解密 while (inputLen - offSet > 0) { if (inputLen - offSet > maxDecryptBlock) { cache = cipher.doFinal(encryptedData, offSet, maxDecryptBlock); } else { cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet); } out.write(cache, 0, cache.length); i++; offSet = i * maxDecryptBlock; } byte[] decryptedData = out.toByteArray(); out.close(); return new String(decryptedData , StandardCharsets.UTF_8); }
时间: 2024-02-14 14:35:10 浏览: 30
这段代码是使用私钥对加密后的数据进行解密。它首先获取私钥的长度,然后根据长度生成解密长度。接着使用私钥初始化 Cipher 对象,然后对使用 Base64 编码后的加密数据进行解码。接下来对数据进行分段解密,每次解密的数据块大小不能超过最大解密长度。最后将解密后的数据转换成字符串返回。这段代码使用的是 RSA 算法进行加解密。
相关问题
try{ kp.genKeyPair(); rpk = (RSAPublicKey)kp.getPublic(); // rpvk = (RSAPrivateKey)kp.getPrivate(); RSAPrivateCrtKey priKey = (RSAPrivateCrtKey)kp.getPrivate(); short publicKeySize = (short)(rpk.getSize()/8); short privateKeySize = priKey.getSize(); byte[] publicKey = JCSystem.makeTransientByteArray((short) (publicKeySize), JCSystem.CLEAR_ON_DESELECT); rpk.getModulus(publicKey, (short) 0); priKey.getP(buf, (short) 0); // Util.arrayCopyNonAtomic(publicKey, (short) 0, buf, (short) 0, (short) (publicKeySize )); apdu.setOutgoing(); apdu.setOutgoingLength((short)(publicKeySize)); apdu.sendBytes((short) 0, (short) (publicKeySize)); /* rpk.getExponent(buf, (short)0); rpk.getModulus(buf, (short)3); apdu.setOutgoing(); apdu.setOutgoingLength((short)(rpk.getSize()/8+3)); apdu.sendBytes((short)0, (short)(rpk.getSize()/8+3)); */ }catch(Exception e){ ISOException.throwIt((short) 0x1234); } break;
这段代码看起来像是 Java Card 应用程序中的一部分,用于生成 RSA 密钥对,并将公钥发送回应用程序的主机。代码的主要部分如下:
```
kp.genKeyPair();
rpk = (RSAPublicKey)kp.getPublic();
RSAPrivateCrtKey priKey = (RSAPrivateCrtKey)kp.getPrivate();
short publicKeySize = (short)(rpk.getSize()/8);
short privateKeySize = priKey.getSize();
byte[] publicKey = JCSystem.makeTransientByteArray((short) (publicKeySize), JCSystem.CLEAR_ON_DESELECT);
rpk.getModulus(publicKey, (short) 0);
priKey.getP(buf, (short) 0);
apdu.setOutgoing();
apdu.setOutgoingLength((short)(publicKeySize));
apdu.sendBytes((short) 0, (short) (publicKeySize));
```
首先,它调用 `kp.genKeyPair()` 生成一个 RSA 密钥对。然后,它从生成的密钥对中获取公钥 `rpk` 和私钥 `priKey`。它计算出公钥的长度 `publicKeySize`,并使用 `JCSystem.makeTransientByteArray()` 方法创建一个大小为 `publicKeySize` 的临时数组 `publicKey`,用于存储公钥的模数。接下来,它调用 `rpk.getModulus()` 获取公钥的模数,并将其存储在 `publicKey` 数组中。最后,它将公钥发送回主机。
需要注意的是,这段代码中的一些变量和方法可能是 Java Card API 中的特定部分,因此可能需要更多的上下文才能完全理解其含义。
rsa生成公钥和私钥加解密生成公钥私钥c语言
RSA是一种非对称加密算法,其公钥和私钥是成对生成的。以下是RSA生成公钥和私钥以及加解密的步骤:
1. 生成RSA公钥和私钥:
首先需要随机生成两个大素数p和q,计算n = p * q,再选取一个整数e(一般为65537),计算d = e^-1 mod ((p-1) * (q-1))。
生成的公钥为(n, e),私钥为(n, d)。
2. RSA加密:
假设要将明文M加密为密文C,使用公钥(n, e)进行加密,计算C = M^e mod n。
3. RSA解密:
使用私钥(n, d)进行解密,计算M = C^d mod n。
以下是一个简单的RSA加解密的C语言实现示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/bio.h>
#include <openssl/rsa.h>
#include <openssl/pem.h>
int main()
{
// 生成RSA公钥和私钥
RSA *rsa = RSA_generate_key(2048, 65537, NULL, NULL);
if (rsa == NULL) {
printf("Failed to generate RSA key pair.\n");
return -1;
}
// 获取公钥和私钥
BIO *pubBio = BIO_new(BIO_s_mem());
BIO *priBio = BIO_new(BIO_s_mem());
PEM_write_bio_RSAPublicKey(pubBio, rsa);
PEM_write_bio_RSAPrivateKey(priBio, rsa, NULL, NULL, 0, NULL, NULL);
// 获取公钥和私钥字符串
char pubKey[1024] = {0};
char priKey[4096] = {0};
BIO_read(pubBio, pubKey, sizeof(pubKey));
BIO_read(priBio, priKey, sizeof(priKey));
// 输出公钥和私钥
printf("Public Key:\n%s\n", pubKey);
printf("Private Key:\n%s\n", priKey);
// 加密明文
char *plaintext = "Hello World!";
int plaintextLen = strlen(plaintext) + 1;
char ciphertext[4096] = {0};
int ciphertextLen = RSA_public_encrypt(plaintextLen, (unsigned char *)plaintext,
(unsigned char *)ciphertext, rsa, RSA_PKCS1_PADDING);
if (ciphertextLen == -1) {
printf("Failed to encrypt plaintext.\n");
return -1;
}
// 输出密文
printf("Ciphertext:\n");
for (int i = 0; i < ciphertextLen; i++) {
printf("%02x", ciphertext[i]);
}
printf("\n");
// 解密密文
char decrypted[4096] = {0};
int decryptedLen = RSA_private_decrypt(ciphertextLen, (unsigned char *)ciphertext,
(unsigned char *)decrypted, rsa, RSA_PKCS1_PADDING);
if (decryptedLen == -1) {
printf("Failed to decrypt ciphertext.\n");
return -1;
}
// 输出解密后的明文
printf("Decrypted plaintext: %s\n", decrypted);
// 释放资源
RSA_free(rsa);
BIO_free_all(pubBio);
BIO_free_all(priBio);
return 0;
}
```
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)