我正在用RSA私钥加密我的对称密钥(AES),并用我的公钥解密它。
但是,当我加密数据时,字节长度是16字节,然而,当我解密数据时,它抛出了受影响的错误,解密时字节数据的长度是344。
public static String encrypt(byte[] data, PrivateKey privateKey) throws Exception {
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.ENCRYPT_MODE, privateKey);
return Base64.getEncoder().encodeToString(cipher.doFinal(data));
}
public static String decrypt(byte[] data, PublicKey publicKey) throws Exception {
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.DECRYPT_MODE, publicKey);
System.out.println(data.length);
return new String(Base64.getDecoder().decode(cipher.doFinal(data)));
}
CertificateFactory fact = CertificateFactory.getInstance("X.509");
InputStream file1 = new FileInputStream("C:\\Users\\imjme1\\Desktop\\Work_backup\\FMS\\EPM_FILE_ENCRYPTION\\NIFT_SOLUTION\\Certificate_KeyStore\\cdcCert.cer");
Certificate[] chain = { fact.generateCertificate(file1) };
file1.close(); // or use try-with-resources
KeyStore keyStore = KeyStore.getInstance( "JKS" );
FileInputStream is = new FileInputStream("C:\\\\Users\\\\imjme1\\\\Desktop\\\\Work_backup\\\\FMS\\\\EPM_FILE_ENCRYPTION\\\\NIFT_SOLUTION\\\\Certificate_KeyStore\\\\senderKeystore.jks");
keyStore.load( is, "fms123".toCharArray() );
PrivateKey privateKey = ( PrivateKey ) keyStore.getKey( "CDC", "fms123".toCharArray() );
PublicKey publicKey= null;
if (privateKey instanceof PrivateKey) {
// Get certificate of public key
Certificate cert = keyStore.getCertificate("CDC");
// Get public key
publicKey = cert.getPublicKey();
}
KeyGenerator generator = KeyGenerator.getInstance("AES");
generator.init(128); // The AES key size in number of bits
SecretKey secKey = generator.generateKey();
String e = encrypt( secKey.getEncoded() , privateKey);
PrintWriter w = new PrintWriter( new File("C:\\Users\\imjme1\\Desktop\\Work_backup\\FMS\\EPM_FILE_ENCRYPTION\\NIFT_SOLUTION\\Certificate_KeyStore\\tet.txt") );
w.write(e);
w.close();
// encrypt(secKey.getEncoded(), privateKey);
Path fileLocation = Paths.get("C:\\Users\\imjme1\\Desktop\\Work_backup\\FMS\\EPM_FILE_ENCRYPTION\\NIFT_SOLUTION\\Certificate_KeyStore\\tet.txt");
//
//
byte[] data = Files.readAllBytes(fileLocation);
String d = decrypt( data , publicKey);
System.out.println(d);
System.out.println("done");
我用Base64编/解码器解决了这个问题
public static String encrypt(byte[] data, PrivateKey privateKey) throws Exception {
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.ENCRYPT_MODE, privateKey);
return Base64.getEncoder().encodeToString(cipher.doFinal(data));
}
public static String decrypt(byte[] data, PublicKey publicKey) throws Exception {
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.DECRYPT_MODE, publicKey);
System.out.println(data.length);// it was 344 here
byte[] decoded = Base64.getDecoder().decode(data);
byte[] todecrypt = cipher.doFinal(decoded);
System.out.println(decoded.length);// it become 256
String finalstring = new String( todecrypt, "UTF-8" );
return finalstring;
}
我使用rsa密钥加密一个长字符串,并将它发送到我的服务器(将使用服务器的公钥和私钥加密它),但它会引发类似我觉得到目前为止我还没有正确理解rsa的工作方式(使用内置库是造成这种情况的原因)。 有人能解释为什么会引发此异常吗?难道根本不可能发送加密的长字符串吗?
问题内容: 我正在使用rsa密钥对要发送到服务器的长字符串进行加密(将使用服务器的公钥和我的私钥对它进行加密),但是它抛出一个异常,就像 我觉得到目前为止我还不了解rsa的工作原理一样(使用内置库是造成这种情况的原因)。 可以请一个人解释为什么抛出此异常。根本不可能发送加密的长字符串吗? 问题答案: RSA算法只能加密具有以字节为单位的RSA密钥长度的最大字节长度除以8减去11的填充字节的数据,即
我写了一个小聊天和消息对象像 发送到服务器,服务器将其传播给所有注册用户。我想加密message对象看起来像的plaintextmessage部分 我已经在服务器和客户端上构建了我的RSA密钥对。 然后我将服务器公钥编码为字节数组,将此数组编码为Base64编码的字符串,并将其发送给客户端。 客户端和服务器都实现了这些功能 当我试图在客户端加密一条消息,将其发送到服务器并在那里解密时,我得到了错误
我正在使用T=0协议中的卡: > 00 C0 00 XX 关于ISO7816-3,我希望该卡能给出以下回应: 如果,我会发送: 以此类推,直到最后我得到了。 然而,这是我实际拥有的(TPDU级别): 我必须反复发送P3=00(256)的GET响应,读取256个字节,并且没有状态字,直到卡警告我实际读取的字节数少于256。 我找不到规范中允许卡“跳过”状态词的部分,或者如何处理超过256字节的答案。
问题内容: 我正在尝试使用javax.smartcardio 读取智能卡(德语Gesundheitskarte) 在EF“ PD” 的定义中,其长度指定为850字节。内容应该是一个gzip压缩的ISO5589-15编码的XML字符串作为指定在这里 作为CommandAPDU,我发送 获取前256个字节。发送后 我得到下一个256个字节。 但是我如何得到其余的呢? 我怎么知道二进制数据何时结束? 德