gpt4 book ai didi

java - 解密期间填充 block 损坏(Android)

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:49:59 34 4
gpt4 key购买 nike

我正在用 java 加密文件并将加密的文件和私钥发送到 android 设备。但是在 Android 中解密文件时,会出现 pad block corrupted 错误。顺便说一下,同样的解密代码也适用于 PC

这里是加密:

public void encrypt(File inf, File outf, File publicKey, int userId, int resourceId) throws ArServerConnectionException {
// ENCRYPTION BEGIN
try {
pkCipher = Cipher.getInstance("RSA");
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchPaddingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// create AES shared key cipher
try {
aesCipher = Cipher.getInstance("AES");
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchPaddingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

try {
makeKey();
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// File operation

try {
saveKey(new File(System.getProperty("user.home") + "/" + userId
+ "/keyfile"), publicKey);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (GeneralSecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// File operation

try {
encryptFiles(inf, outf);
} catch (InvalidKeyException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

// /ENCRYPTION END
}

public void saveKey(File out, File publicKeyFile) throws IOException,
GeneralSecurityException {
// read public key to be used to encrypt the AES key
byte[] encodedKey = new byte[(int) publicKeyFile.length()];
new FileInputStream(publicKeyFile).read(encodedKey);

// create public key
X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(encodedKey);
KeyFactory kf = KeyFactory.getInstance("RSA");
PublicKey pk = kf.generatePublic(publicKeySpec);

// write AES key
pkCipher.init(Cipher.ENCRYPT_MODE, pk);
CipherOutputStream os = new CipherOutputStream(
new FileOutputStream(out), pkCipher);
os.write(aesKey);
os.close();
}
public void makeKey() throws NoSuchAlgorithmException {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(AES_Key_Size);
SecretKey key = kgen.generateKey();
aesKey = key.getEncoded();
aeskeySpec = new SecretKeySpec(aesKey, "AES");
}

解密部分如下:

public class FileDecrypt {
public static final int AES_Key_Size = 256;

Cipher pkCipher, aesCipher;
byte[] aesKey;
SecretKeySpec aeskeySpec;
private String pubKeyPath=null;
private String prvKeyPath=null;
private String keyFilePath=null;
private String encFilePath=null;
private String unencFilePath=null;


public String getEncFilePath() {
return encFilePath;
}

public void setEncFilePath(String encFilePath) {
this.encFilePath = encFilePath;
}

public String getUnencFilePath() {
return unencFilePath;
}

public void setUnencFilePath(String unencFilePath) {
this.unencFilePath = unencFilePath;
}

public String getPubKeyPath() {
return pubKeyPath;
}

public void setPubKeyPath(String pubKeyPath) {
this.pubKeyPath = pubKeyPath;
}

public String getPrvKeyPath() {
return prvKeyPath;
}

public void setPrvKeyPath(String prvKeyPath) {
this.prvKeyPath = prvKeyPath;
}

public String getKeyFilePath() {
return keyFilePath;
}

public void setKeyFilePath(String keyFilePath) {
this.keyFilePath = keyFilePath;
}
public void decrypt() {
Log.i("DECRYPT","**************************************************DECRYPT&*******************");
Log.i("encFilePath",encFilePath);
Log.i("pubKeyPath",pubKeyPath);
Log.i("prvKeyPath",prvKeyPath);
Log.i("keyFilePath",keyFilePath);
Log.i("unencFilePath",unencFilePath);
Log.i("DECRYPT","********************************************DECRYPT&*******************");
try {
pkCipher = Cipher.getInstance("RSA");
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchPaddingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
aesCipher = Cipher.getInstance("AES");
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchPaddingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//DECRYPTION BEGIN

File pkf=new File(pubKeyPath);
byte[] encodedKey = new byte[(int) pkf.length()];
try {
new FileInputStream(pkf).read(encodedKey);
// create public key
X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(encodedKey);
KeyFactory kf = KeyFactory.getInstance("RSA");
PublicKey pk = kf.generatePublic(publicKeySpec);

// write AES key
pkCipher.init(Cipher.ENCRYPT_MODE, pk);
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvalidKeyException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvalidKeySpecException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
loadKey(new File(keyFilePath), new File(prvKeyPath));
} catch (GeneralSecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

try {
decrypt(new File(encFilePath), new File(unencFilePath));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

//DECRYPTION END
}

/**
* Decrypts an AES key from a file using an RSA private key
*/
public void loadKey(File in, File privateKeyFile)
throws GeneralSecurityException, IOException {
// read private key to be used to decrypt the AES key
byte[] encodedKey = new byte[(int) privateKeyFile.length()];
new FileInputStream(privateKeyFile).read(encodedKey);

// create private key
PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(encodedKey);
KeyFactory kf = KeyFactory.getInstance("RSA");
PrivateKey pk = kf.generatePrivate(privateKeySpec);

// read AES key
pkCipher.init(Cipher.DECRYPT_MODE, pk);
aesKey = new byte[AES_Key_Size / 8];
CipherInputStream is = new CipherInputStream(new FileInputStream(in),
pkCipher);
is.read(aesKey);
aeskeySpec = new SecretKeySpec(aesKey, "AES");
}

/**
* Decrypts and then copies the contents of a given file.
*/
public void decrypt(File in, File out) throws IOException
{
try {
aesCipher.init(Cipher.DECRYPT_MODE, aeskeySpec);
} catch (InvalidKeyException e) {
Log.i("EXCEPTION","INVALID KEY EXCEPTION");
e.printStackTrace();
}

CipherInputStream is = new CipherInputStream(new FileInputStream(in),
aesCipher);
FileOutputStream os = new FileOutputStream(out);

copy(is, os);

is.close();
os.close();
}

/**
* Copies a stream.
*/
private void copy(InputStream is, OutputStream os) throws IOException {
int i;
byte[] b = new byte[2048];
while ((i = is.read(b)) != -1) {
os.write(b, 0, i);
}
}
}

最佳答案

我们也面临同样的问题,只有在 android 端(使用 android SDK)也进行加密部分然后在设备上解密才能解决。没有找到该问题的其他正确原因..

关于java - 解密期间填充 block 损坏(Android),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3749556/

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