- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
无法解密使用 Blowfish 在 Go 语言中加密的 Java 密文。
加密
import (
"testing"
"golang.org/x/crypto/blowfish"
"github.com/andreburgaud/crypt2go/ecb"
"github.com/andreburgaud/crypt2go/padding"
"fmt"
"encoding/base64"
)
func TestEncrypt(t *testing.T) {
bytes := []byte("cap")
key := []byte("1c157d26e2db9a96a556e7614e1fbe36")
encByte := encrypt(bytes, key)
enc := base64.StdEncoding.EncodeToString(encByte)
fmt.Printf("ENC - %s\n", enc)
}
func encrypt(pt, key []byte) []byte {
block, err := blowfish.NewCipher(key)
if err != nil {
panic(err.Error())
}
mode := ecb.NewECBEncrypter(block)
padder := padding.NewPkcs5Padding()
pt, err = padder.Pad(pt) // padd last block of plaintext if block size less than block cipher size
if err != nil {
panic(err.Error())
}
ct := make([]byte, len(pt))
mode.CryptBlocks(ct, pt)
return ct
}
// Output
// ENC - AP9atM49v8o=
解密
import lombok.SneakyThrows;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import static java.util.Base64.getDecoder;
import static java.util.Base64.getEncoder;
public class UserAuthenticationFilter {
public static void main(String[] args) throws Exception {
String key = "1c157d26e2db9a96a556e7614e1fbe36";
System.out.println(decrypt(getDecoder().decode("AP9atM49v8o="), key));
// encryption and decryption verification
// String plainText = "cap";
// String cipher = encrypt(plainText, key);
// String decrypted = decrypt(getDecoder().decode(enc), key);
// assert decrypted.equals(plainText);
}
@SneakyThrows
public static String encrypt(String plainText, String key) {
byte[] myKeyByte = hexToBytes(key);
SecretKeySpec skeySpec = new SecretKeySpec(myKeyByte, "Blowfish");
Cipher ecipher = Cipher.getInstance("Blowfish/ECB/PKCS5Padding");
ecipher.init(Cipher.ENCRYPT_MODE, skeySpec);
byte[] src = ecipher.doFinal(plainText.getBytes("ISO-8859-1"));
return getEncoder().encodeToString(src);
}
@SneakyThrows
public static String decrypt(byte[] cipherContent, String key) {
byte[] myKeyByte = hexToBytes(key);
SecretKeySpec skeySpec = new SecretKeySpec(myKeyByte, "Blowfish");
Cipher dcipher = Cipher.getInstance("Blowfish/ECB/NoPadding");
dcipher.init(2, skeySpec);
byte[] dcontent = dcipher.doFinal(cipherContent);
return (new String(dcontent, "ISO-8859-1")).trim();
}
private static byte[] hexToBytes(String str) {
if (str == null) {
return null;
} else if (str.length() < 2) {
return null;
} else {
int len = str.length() / 2;
byte[] buffer = new byte[len];
for(int i = 0; i < len; ++i) {
buffer[i] = (byte)Integer.parseInt(str.substring(i * 2, i * 2 + 2), 16);
}
return buffer;
}
}
}
// Output
// BY x³
根据输出,GoLang 中的加密和 Java 中的解密不会生成相同的纯文本。最初以为问题可能与golang的byte(0到255)和java的base64编码解码涉及的byte(-128到127)有关。但是查看 Java 的解密代码,可以使用 value & 255
正确处理它。
在golang中解密相同的密文非常完美。 Java 中的加密和解密也可以完美运行。但不是一个加密和另一个解密。
我认为加密和解密逻辑是正确的。唯一的猜测可能是有一些特定的语言???密文移植到其他语言解密时会丢失。
最佳答案
key := []byte("1c157d26e2db9a96a556e7614e1fbe36")
我相信这段代码返回字符串本身的字节数组,而不是十六进制解码值。要获得有效 key ,您可以尝试使用 hex decoding
关于java - Blowfish GoLang加密与Java解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51356504/
我似乎找不到差异的来源。我在这个在线解密工具中发现了这种差异 http://www.tools4noobs.com/online_tools/decrypt/ 我有一些加密的 Blowfish 数据,
C++ blowfish 支持加密少于 C# NET BlowfishC++ Blowfish<-- 在 C++ 和 C# 应用程序中,我加密了以下数组 byte response[6] =
我必须实现java密码空间填充。我正在尝试编写支持 Blowfish/CBC/space 模式的 Perl 代码的实现。我在Java Cipher列表中找不到相关模式,仅支持PCK5Padding和N
我正在使用 Blowfish 实现一个简单的密码存储。一切都很好,直到我尝试了几种不同的密码/ key 组合,并遇到了许多解密值仍然是垃圾的情况。 下面是一个演示该问题的独立类。我得到以下输出: 'A
我正在做一个关于图像加密的项目。我们在图像上使用河豚加密。根据 Paul Kocher 的代码 http://www.schneier.com/blowfish-download.html 。主要功能
在将此标记为重复之前,请理解我在 stackoverflow 上找不到任何关于河豚的有用信息。我正在尝试使用 Android Studio 使用河豚加密和解密字符串。我的加密似乎有效。但是当我尝试解密
我正在尝试通过Blowfish解密十六进制编码的字符串。但结果与正确的不同。 String s="a1d0534e4baf9e670bde8670caee8b87" String decKey = "
我今天一整天都在尝试找出如何读取二进制文件并对其进行解密。 在我的文件中,前 4 个字节描述文件格式,后 32 个字节是 header ,使用 Blowfish 加密。 所以我写了这段代码来做到这一点
我用 Blowfish 编码做了一些测试,发现了一些东西。编码后的字符串并不总是与源字符串一样长。有时会更短。 如果我想解码编码字符串,我需要在 openssl 函数中解码的长度: BF_cfb64_
我正在将 C++ TCP 客户端翻译成 C#。该客户端用于使用河豚对数组的 4 个字节进行编码。 C++ Blowfish C# Blowfish(C# NET) C++ BYTE respo
我正在尝试让一个 bowfish 函数用于简单的字符缓冲区。当我尝试解密加密缓冲区并在 EVP_CipherFinal_ex() 调用上失败时,程序失败。 #include #include #i
我正在用 Blowfish 算法加密我的文件,但我似乎对此一无所知。每当我尝试 Encipher() 时,它都会抛出一个异常,提示“无效长度”。我认为当它用 8 进行模数时,长度必须为零,我认为这
许多脚本语言(Python/PHP/等...)包含允许您使用 Blowfish 作为密码单向散列的功能(有时通过扩展)。我正在尝试为 C++ 找到类似的实现,但我遇到的一切都是加密/解密解决方案。 有
我一直在研究在 php 应用程序中保护密码的更好程序。形式上我会使用类似的东西(只是一个例子,不要开枪!): $salt = md5(rand() . md5(rand() . '$%E$%SDRT'
无法解密使用 Blowfish 在 Go 语言中加密的 Java 密文。 加密 import ( "testing" "golang.org/x/crypto/blowfish"
考虑以下执行 Blowfish 加密的方法: import javax.crypto.Cipher; import javax.crypto.Mac; import javax.crypto.spec
我们有一个类,它包装 BouncyCaSTLe(实际上是 Android 的 SpongyCaSTLe)Blowfish,以加密要传输的数据: public class BlowfishOutputS
Blowfish 能够进行强加密,并且可以使用最大 56 字节的 key (448 位 key )。 key 必须是 8 字节的倍数(最多 56)。 我想编写一个示例,它将自动填充和取消填充键的大小。
这是加密和解密消息的基本代码: #include #include #include //gcc cryptage.c -o cryptage -lcrypto int main(){ BF_K
我很难弄清楚如何使用 C# bouncycaSTLe 库来解密河豚 CTR 密文。由于缺少关于如何使用它的 BC 文档,我不知道如何使用它 我广泛搜索但没有在堆栈溢出中找到类似的东西,如果您有一些关于
我是一名优秀的程序员,十分优秀!