请在您将此标记为副本之前了解,我在stackoverflow上找不到任何有关河豚的有用信息。我正在尝试使用Android Studio使用blowfish加密和解密字符串。我的加密似乎起作用了。但当我尝试解密所述字符串时,它实际上更短,而且是用字符编码的。我是加密的新手,非常感谢你的帮助。
加密
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
public class Encryption {
private String algorithm = "Blowfish/CBC/PKCS5Padding";
private SecretKeySpec keySpec;
private Cipher cipher;
public void setupForEncryption(String keyString) throws java.security.GeneralSecurityException, UnsupportedEncodingException {
byte[] keyData = keyString.getBytes();
keySpec = new SecretKeySpec(keyString.getBytes("UTF-8"), "Blowfish");
cipher = Cipher.getInstance(algorithm);
}
public SecretKeySpec getSecretKey() {
return keySpec;
}
public boolean checkForKeySpec() {
if (keySpec != null) {
return true;
}
return false;
}
public String encryptString(String inputString) throws java.security.GeneralSecurityException, UnsupportedEncodingException {
IvParameterSpec ivSpec = new IvParameterSpec(keySpec.getEncoded());
cipher.init(Cipher.ENCRYPT_MODE, getSecretKey(),ivSpec);
byte[] encryptedBytes = cipher.doFinal(inputString.getBytes("UTF-8"));
return new String(encryptedBytes);
}解密
import android.util.Base64;
import java.io.UnsupportedEncodingException;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
public class Decryption {
private SecretKeySpec keySpec;
private String algorithm = "Blowfish/CBC/PKCS5Padding";
private Cipher cipher;
public void setupForDecryption(String key) throws NoSuchPaddingException, NoSuchAlgorithmException, UnsupportedEncodingException {
byte[] keyData = key.getBytes();
keySpec = new SecretKeySpec(key.getBytes("UTF-8"), "Blowfish");
cipher = Cipher.getInstance(algorithm);
}
public boolean checkForKeySpec() {
if(keySpec != null){
return true;
}
return false;
}
public SecretKeySpec getSecretKey() {
return keySpec;
}
public String decryptString(String inputString) throws InvalidKeyException, BadPaddingException, IllegalBlockSizeException, InvalidAlgorithmParameterException, UnsupportedEncodingException {
IvParameterSpec ivSpec = new IvParameterSpec(keySpec.getEncoded());
cipher.init(Cipher.DECRYPT_MODE, getSecretKey(),ivSpec);
byte[] decryptedBytes = Base64.decode(inputString,0);
String decrypted = new String(decryptedBytes);
return decrypted;
}
}发布于 2016-03-15 16:09:00
您是在加密期间执行此操作的:
return new String(encryptedBytes);其中encryptedBytes可以由任何字节值组成。通过强制将这些字节转换为字符串,您实际上删除了那些不能以默认编码打印的字节。
此外,在解密过程中,您忘记了解密(cipher.doFinal(inputString.getBytes("UTF-8")))。我只看到Base64.decode,它是一种编码,而不是加密。
如果要发送字符串,则需要将字节数组编码为具有Base64或十六进制等编码的可打印字符串。
在从字节转换为字符串bytes.getBytes("UTF-8")和back new String(str, "UTF-8")时,请始终使用特定的编码。否则,当默认字符集更改时,您可能会遇到设备之间的不兼容问题。
始终使用CBC模式的随机静脉输液。它提供了语义安全性。IV不必保密,因此您可以简单地将其与密文一起发送,并在解密期间使用它。在密文前加上前缀是很常见的。
https://stackoverflow.com/questions/36002834
复制相似问题