gpt4 book ai didi

java - 错误填充异常 : invalid ciphertext

转载 作者:行者123 更新时间:2023-12-02 07:24:36 27 4
gpt4 key购买 nike

我需要一些帮助,因为这是我第一次编写加密代码。

加密代码似乎工作正常,但解密抛出错误。

我得到的错误是:

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com