java - 在 Java 中加密字符串并在 C++ 中解密

标签 java c++ cryptography encryption

我需要用 Java 加密字符串并用 C++ 解密。我已经看到 C++ 有一个 Crypto++ 库,而 Java 有 JCE、Jasypt、BouncyCaSTLe 等。但我越来越困惑...

我正在寻找简单的东西。此用例不需要高安全性。一侧的加密算法与另一侧的加密算法类似,以最简单的方式配置它们很重要。


编辑(改进解释):

我想这样做:

  • Java 中:获取一个输入字符串,用字符串密码加密它(并且不是字节数组或初始化 vector 等其他东西),获取加密字符串

  • C++中:接收上述加密后的字符串,用与上述相同的字符串密码解密,得到原始输入字符串

    <

对于 Java 部分,我知道这个 Jasypt 代码:

StandardPBEStringEncryptor hexEncryptor = new StandardPBEStringEncryptor() ;
hexEncryptor.setStringOutputType("hexadecimal");
hexEncryptor.setPassword(ENCRYPTION_PASSWORD);
String encryptedString = hexEncryptor.encrypt(inputString);

这会很棒,但我不知道它使用哪种算法以及 C++ 中用于解密它的类似算法是什么。

最佳答案

您可以做到,这不是一项繁重的工作。您只需要来自加密库的构建 block 。

  1. 使用 PBKDF1 或 PBKDF2 进行 key 派生。这两种算法在 C++ 和 Java 中都有许多实现。你输入一个密码,你就会得到一个对称加密 key 。

  2. 你说“高安全性并不重要”,我认为这没有多大意义(你要么有安全性,要么没有),但让我捕获它并理解它的意思您会满足于使用 RC4 等流密码而不是 AES 及其 IV 和 block 密码模式等,这在各种实现中可能会很痛苦。

  3. 所以使用 RC4 又名 ARC4。同样,Java 和 C++ 中的许多实现。您将您的 key 和一串字节输入它,然后输出一串字节:明文或密文,具体取决于操作。 RC4 的名声并不大,但时至今日,它仍是 IE 和 IIS 中用于 TLS 的默认密码。 RC4 你会没事的。 (出于很多原因,我不是 IE 和 IIS 的粉丝,但 RC4 不在我的列表中。)

  4. 为了更好地衡量,您可能希望在使用 header 加密之前为明文添加前缀。您可以将明文的长度和明文的 SHA1/256/512(随您选择)哈希值放在 header 中。同样,这些哈希算法在 C++ 和 Java 中有许多很好的实现。然后您加密 header 和明文。这样就很容易判断解密是否顺利;只需验证长度和哈希字段。

只要您在 C++ 和 Java 中使用相同的、完善的算法,并且您有定义明确的交换格式(参见上面的 4),您就可以快速、安全地解决这个问题。

编辑:

请注意,有一些适用于流密码的警告。引用施奈尔的话:

One of the most important rules of stream ciphers is to never use the same keystream to encrypt two different documents. If someone does, you can break the encryption by XORing the two ciphertext streams together. The keystream drops out, and you end up with plaintext XORed with plaintext -- and you can easily recover the two plaintexts using letter frequency analysis and other basic techniques.

It's an amateur crypto mistake. The easy way to prevent this attack is to use a unique initialization vector (IV) in addition to the key whenever you encrypt a document.

关于java - 在 Java 中加密字符串并在 C++ 中解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4458726/

相关文章:

Java 代码检查显示返回 null 的方法从不为 null

c++ - C中isupper的宏定义是什么?

java - 加密/解密文件系统中的 Json 文件

java - 将单记录 csv 文件读入类字段的编程习惯

java - 如何使用 Intent.ACTION_CALL 选择要调用的号码?

具有按签名和类型指向成员函数的指针的 C++ 模板

c++ - 为什么 const/non-const 函数重载的继承不明确?

c# - 在Python中使用公共(public)模数和指数进行RSA加密密码

php - 如何保护站点范围的 key

java - 在eclipse luna中运行maven项目