首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Blowfish加密问题

Blowfish加密问题
EN

Stack Overflow用户
提问于 2016-03-15 12:42:33
回答 1查看 561关注 0票数 2

请在您将此标记为副本之前了解,我在stackoverflow上找不到任何有关河豚的有用信息。我正在尝试使用Android Studio使用blowfish加密和解密字符串。我的加密似乎起作用了。但当我尝试解密所述字符串时,它实际上更短,而且是用字符编码的。我是加密的新手,非常感谢你的帮助。

加密

代码语言:javascript
复制
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);
}

解密

代码语言:javascript
复制
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;
}
}
EN

回答 1

Stack Overflow用户

发布于 2016-03-15 16:09:00

您是在加密期间执行此操作的:

代码语言:javascript
复制
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不必保密,因此您可以简单地将其与密文一起发送,并在解密期间使用它。在密文前加上前缀是很常见的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36002834

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档