gpt4 book ai didi

java - Android Studio 上的 Blowfish 用于加密/解密

转载 作者:行者123 更新时间:2023-12-02 03:08:51 24 4
gpt4 key购买 nike

我已经搜索了几乎所有关于这个主题的主题,但我仍然不知道出了什么问题。我在我的 Android 应用程序上创建了 3 个 EditText:EditText 在其中插入 key /密码以进行加密和解密;EditText2 显示加密文本;EditText3 显示解密的文本。

由于这仍然是一个早期测试,我已将消息或字符串作为应用程序中的变量放入 Crypt。

问题是加密给出了类似河豚算法的东西,所以没有问题(它以 2 == 结尾,所以我认为它工作正常)。我还尝试在解密之前解码字符串或使用加密中的原始 byte[] ,但没有任何好的结果。解密不会返回原始字符串文本,而是给出比加密文本更大的内容。我对河豚的模式没有偏好,所以我开始时选择了河豚/CFB/NoPadding 模式。

str_keystr2str3 目前已声明为公共(public)。 str2 将设置 EditText2 字段的文本,str3 将设置 EditText3 字段的文本。输出示例: Example of output generated from the app

代码如下:

public void encrypt(){
//encrypt
EditText mEdit = (EditText)findViewById(R.id.editText);
str_key = (String) mEdit.getText().toString();

int iterationCount = 1000;
int keyLength = 256;
int saltLength = keyLength / 8;

SecureRandom random = new SecureRandom();
byte[] salt = new byte[saltLength];
random.nextBytes(salt);
KeySpec keySpec = new PBEKeySpec(str_key.toCharArray(), salt,
iterationCount, keyLength);
SecretKeyFactory keyFactory = null;
try {
keyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
byte[] keyBytes = new byte[0];
try {
keyBytes = keyFactory.generateSecret(keySpec).getEncoded();
} catch (InvalidKeySpecException e) {
e.printStackTrace();
}
SecretKey key = new SecretKeySpec(keyBytes, "Blowfish");

Cipher cipher = null;
try {
cipher = Cipher.getInstance("Blowfish/CBC/PKCS5Padding");
} catch (NoSuchAlgorithmException | NoSuchPaddingException e) {
e.printStackTrace();
}
if ( cipher == null || key == null) {
//throw new Exception("Invalid key or cypher");
str2="error";
}
else {
byte[] iv = new byte[cipher.getBlockSize()];
random.nextBytes(iv);
IvParameterSpec ivParams = new IvParameterSpec(iv);
try {
cipher.init(Cipher.ENCRYPT_MODE, key,ivParams);
} catch (InvalidKeyException | InvalidAlgorithmParameterException e) {
e.printStackTrace();
}


try {
raw = cipher.doFinal(message.getBytes("UTF-8"));
} catch (IllegalBlockSizeException | BadPaddingException | UnsupportedEncodingException e) {
e.printStackTrace();
}
str2 = Base64.encodeToString(raw,Base64.DEFAULT);

}


}

这是解密函数:

    public void decrypt(){
int iterationCount = 1000;
int keyLength = 256;
int saltLength = keyLength / 8;
SecureRandom random = new SecureRandom();
byte[] salt = new byte[saltLength];
random.nextBytes(salt);
KeySpec keySpec = new PBEKeySpec(str_key.toCharArray(), salt, iterationCount, keyLength);
SecretKeyFactory keyFactory = null;
try {
keyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
byte[] keyBytes = new byte[0];
try {
keyBytes = keyFactory.generateSecret(keySpec).getEncoded();
} catch (InvalidKeySpecException e) {
e.printStackTrace();
}
SecretKey key = new SecretKeySpec(keyBytes, "Blowfish");



Cipher cipher2 = null;
try {
cipher2 = Cipher.getInstance("Blowfish/CBC/PKCS5Padding");
} catch (NoSuchAlgorithmException | NoSuchPaddingException e) {
e.printStackTrace();
}
iv = new byte[cipher2.getBlockSize()];
random.nextBytes(iv);
IvParameterSpec ivSpec = new IvParameterSpec(iv);
try {
cipher2.init(Cipher.DECRYPT_MODE, key, ivSpec );
} catch (InvalidKeyException | InvalidAlgorithmParameterException e) {
e.printStackTrace();
}
byte[] decryptedBytes = null;
byte[] app= Base64.decode(str2,Base64.DEFAULT);

try {
decryptedBytes = cipher2.doFinal(app);
} catch (IllegalBlockSizeException | BadPaddingException e) {
e.printStackTrace();
}


str3 = Base64.encodeToString(decryptedBytes,Base64.DEFAULT);
}

最佳答案

您将加密结果编码为 Base64,但是当您解密时,您将获取该 Base64 的纯字节。您应该首先进行 Base64 解码以获取密文的实际字节数组,然后对其进行解密。

您还直接从 UTF8 字节数组派生 key ,这是一种非常糟糕的方法。您应该使用 KDF。 PBKDF2 是这里最常用的。

生成 IV 的方式(根本不生成 IV)也很差。它应该是随机生成的并添加到密文之前。它不需要保密,只是不可预测。

最后,您根本不使用 HMAC,因此任何人都可以更改密文,而您却不会知道。

关于java - Android Studio 上的 Blowfish 用于加密/解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41349341/

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