- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要一些帮助,因为这是我第一次编写加密代码。
加密代码似乎工作正常,但解密抛出错误。
我得到的错误是:
de.flexiprovider.api.exceptions.BadPaddingException:密文无效</strong>
在代码末尾的解密函数中,标记为注释
//这里抛出错误! ......................................
我已经包含了所有导入内容,请原谅,因为我认为它可能与该问题相关。
任何有关我做错的事情的帮助将不胜感激,非常感谢。
代码:
import java.io.UnsupportedEncodingException;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.SecureRandom;
import java.security.Security;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import android.app.Activity;
import android.os.Bundle;
import android.util.Base64;
import android.util.Log;
import de.flexiprovider.common.ies.IESParameterSpec;
import de.flexiprovider.core.FlexiCoreProvider;
import de.flexiprovider.ec.FlexiECProvider;
import de.flexiprovider.ec.parameters.CurveParams;
import de.flexiprovider.ec.parameters.CurveRegistry.BrainpoolP384r1;
import de.flexiprovider.pki.PKCS8EncodedKeySpec;
import de.flexiprovider.pki.X509EncodedKeySpec;
public class MainActivity extends Activity {
private static PublicKey PublicKey;
private static PrivateKey PrivateKey;
private static String PubKey;
private static String PrvKey;
private static String message = "Hello World";
private static String encryptedMessage;
private static String decryptedMessage;
private final static String TAG = "ERROR: ";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
Security.addProvider(new FlexiCoreProvider());
Security.addProvider(new FlexiECProvider());
// instantiate the elliptic curve key pair generator
KeyPairGenerator kpg = KeyPairGenerator.getInstance("ECIES", "FlexiEC");
// choose the curve
CurveParams ecParams = new BrainpoolP384r1();
// Initialize the key pair generator
kpg.initialize(ecParams, new SecureRandom());
KeyPair keyPair = kpg.generateKeyPair();
// generate the public key
PublicKey = keyPair.getPublic();
// generate private key
PrivateKey = keyPair.getPrivate();
}
catch (Exception e) {
Log.e(TAG, e.toString());
}
// I'm converting keys to strings here as the public keys will be stored on a server
// database and the private keys will be stored in the application preferences file
// this private key storage is maybe not optimum, but at this point I just want to
// simulate a messaging encryption/decryption process for testing purposes
// convert public key to a string
PubKey = Base64.encodeToString(PublicKey.getEncoded(), Base64.DEFAULT);
Log.d("PubKey: ", PubKey);
// convert private key to a string
PrvKey = Base64.encodeToString(PrivateKey.getEncoded(), Base64.DEFAULT);
Log.d("PrvKey: ", PrvKey);
// encrypt the message with the public key
encryptedMessage = encryptMessage(PubKey, message);
// report if the public key has not been regenerated correctly
if (encryptedMessage == null) {
Log.d("PUBLIC_KEY_REGENERATE_ERROR: ", encryptedMessage);
}
// decrypt the message with the private key
decryptedMessage = decryptMessage(PrvKey, encryptedMessage);
// report if the private key has not been regenerated correctly
if (encryptedMessage == null) {
Log.d("PRIVATE_KEY_REGENERATE_ERROR: ", decryptedMessage);
}
}
// encrypt function
public static String encryptMessage(String publicKey, String message) {
KeyFactory keyFactory = null;
PublicKey pubkey = null;
Cipher cipher = null;
byte[] PLAINTEXT_MESSAGE = message.getBytes();
Log.d("PLAINTEXT_MESSAGE: ", message);
Security.addProvider(new FlexiCoreProvider());
Security.addProvider(new FlexiECProvider());
// Base64 decode the publicKey string into a byte array
byte[] decodedPublicKey = Base64.decode(publicKey, Base64.DEFAULT);
try {
// instantiate a X509EncodedKeySpec
X509EncodedKeySpec X509spec = new X509EncodedKeySpec(decodedPublicKey);
keyFactory = KeyFactory.getInstance("ECIES", "FlexiEC");
// re-generate the public key
pubkey = keyFactory.generatePublic(X509spec);
// sanity check, return null on inequality
if (!pubkey.equals(PublicKey)) {
return null;
}
cipher = Cipher.getInstance("ECIES", "FlexiEC");
IESParameterSpec IESspec = new IESParameterSpec("AES256_CBC", "HmacSHA512", null, null);
cipher.init(Cipher.ENCRYPT_MODE, pubkey, IESspec);
}
catch (Exception e) {
Log.e(TAG, e.toString());
}
// encrypt the message
byte[] encryptedData = null;
try {
encryptedData = cipher.doFinal(PLAINTEXT_MESSAGE);
}
catch (IllegalBlockSizeException e) {
Log.e(TAG, e.toString());
}
catch (BadPaddingException e) {
Log.e(TAG, e.toString());
}
String encryptedMessage = null;
try {
encryptedMessage = new String(encryptedData, "UTF-8");
}
catch (UnsupportedEncodingException e) {
Log.e(TAG, e.toString());
}
Log.d("encryptedMessage: ", encryptedMessage);
return encryptedMessage;
}
// decrypt function
public static String decryptMessage(String privateKey, String message) {
KeyFactory keyFactory = null;
PrivateKey prvkey = null;
Cipher cipher = null;
byte[] ENCRYPTED_MESSAGE = message.getBytes();
Log.d("ENCRYPTED_MESSAGE: ", message);
Security.addProvider(new FlexiCoreProvider());
Security.addProvider(new FlexiECProvider());
try {
// Base64 decode the privateKey string into a byte array
byte[] decodedPrivateKey = Base64.decode(privateKey, Base64.DEFAULT);
// instantiate a PKCS8EncodedKeySpec
PKCS8EncodedKeySpec PKCS8spec = new PKCS8EncodedKeySpec(decodedPrivateKey);
keyFactory = KeyFactory.getInstance("ECIES", "FlexiEC");
// re-generate the private key
prvkey = keyFactory.generatePrivate(PKCS8spec);
// sanity check, return null on inequality
if (!prvkey.equals(PrivateKey)) {
return null;
}
cipher = Cipher.getInstance("ECIES", "FlexiEC");
IESParameterSpec IESspec = new IESParameterSpec("AES256_CBC", "HmacSHA512", null, null);
cipher.init(Cipher.DECRYPT_MODE, prvkey, IESspec);
}
catch (Exception e) {
Log.e(TAG, e.toString());
}
// decrypt the message
byte[] decryptedData = null;
try {
decryptedData = cipher.doFinal(ENCRYPTED_MESSAGE);
// ERROR THROWN HERE! ..............................
// de.flexiprovider.api.exceptions.BadPaddingException: invalid ciphertext
}
catch (IllegalBlockSizeException e) {
Log.e(TAG, e.toString());
}
catch (BadPaddingException e) {
Log.e(TAG, e.toString());
}
String decryptedMessage = null;
try {
decryptedMessage = new String(decryptedData, "UTF-8");
}
catch (UnsupportedEncodingException e) {
Log.e(TAG, e.toString());
}
Log.d("decryptedMessage: ", decryptedMessage);
return decryptedMessage;
}
}
最佳答案
您不能仅使用密文作为 String
构造函数的输入,就像您在这一行中所做的那样:
encryptedMessage = new String(encryptedData, "UTF-8");
如果您想使用字符串而不是字节来传达密文,则必须像使用 key 一样使用 Base 64 等编码。
加密将产生看起来像随机字节的数据。并非所有字节都有等效的字符。转换的结果取决于字符编码。 UTF-8 可能使用许多字节,并且许多组合不会产生正确的字符。 Java 会默默地转换这些内容,请检查 Charset
和相关类以获取更多信息。
关于java - 错误填充异常 : invalid ciphertext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13713991/
我需要一些帮助,因为这是我第一次编写加密代码。 加密代码似乎工作正常,但解密抛出错误。 我得到的错误是: de.flexiprovider.api.exceptions.BadPaddingExcep
尝试使用 AWS KMS 客户端从 Java 应用程序中解密密文。我可以使用命令行使用此命令获取明文值 aws kms decrypt --ciphertext-blob fileb://<(echo
我遇到一个问题:“假设您的 RSA 公钥因子为 p = 6323 和 q = 2833,并且公共(public)指数 e 为 31。假设您收到密文 6627708。编写一个程序,将上述参数作为输入,并
我正在阅读这篇关于 crypto.js 的文章。 https://hibara.org/blog/2016/02/15/cryptojs/ text = "ABCDE" password = "pas
好吧,这些天我一直在经历我个人的 hell 我在解密使用 加密的消息时遇到了一些问题RSA 和我总是失败并显示“RSA/OAEP-MGF1(SHA-1):无效密文” 我有一个用 base64 编码的私
我正在创建一个跨平台 Android/Windows 应用程序。 我使用此代码在 Android 中生成公钥,我可以使用 Windows 应用程序生成的测试公钥: String Ap
我在正确解密字符串时遇到了一些问题。令人愤怒的是,只有前几个字节被弄乱了,其余的字符都是正确的。 因此,当我使用硬编码 IV 进行加密和解密时,我的测试程序运行良好。该程序获取一个字符串,对其进行加密
我正在使用 Simple Encrypted Arithmetic Library (SEAL)来自 Microsoft 密码学研究组的库。有没有办法获取seal::Ciphertext variab
我正在尝试使用 crypto++ 中的 aes 算法加密和解密纯文本 这是我的加密方式 /* * Encrypt the given text */ template T encryptText(
我想将 AES 加密数据存储在数据库字段中。 将 AES IV(每行唯一)存储在密文前面是否安全?例如 IV_CipherText 两者都将以 Base64 编码。 所使用的 key 不会存储在数据库
我知道这个问题被问了很多,但我仍然不明白如何调试我的代码。我在谷歌上搜索这个问题已经超过 3 天了,但我找不到适合我的代码的答案。我想添加带有输入的加密消息,但每次我运行我的代码时它只会给出 Trac
我正在尝试使用 key 和 AES-JS 库解密数据。每当我输入一个 16 字节的 key 时,我都会收到以下错误: Error: "invalid ciphertext size (must be
尝试“制作”cpabe-0.11 toolkit/library 时出现以下错误在 Ubuntu 12.04(64 位)上。系统中正确安装了所有必需的库,包括 libgmp。 /usr/bin/ld:
当我尝试解密使用 crypto++ 库的加密 session key 时,我收到“RSA/OAEP-MGF1(SHA-1):密文长度 154 与此 key 所需的长度 192 不匹配”。 以下是相同的
我是一名优秀的程序员,十分优秀!