- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 AES-128-ECB 加密某个字符串,然后将结果保存在一个文件中,例如 test.enc这是我进行加密的方法:
int do_crypt(char *outfile) {
unsigned char outbuf[1024];
int outlen, tmplen;
unsigned char key[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
char intext[] = "Some Text";
EVP_CIPHER_CTX ctx;
FILE *out;
EVP_CIPHER_CTX_init(&ctx);
EVP_EncryptInit_ex(&ctx, EVP_aes_128_ecb(), NULL, key, NULL);
if(!EVP_EncryptUpdate(&ctx, outbuf, &outlen, intext, strlen(intext))) {
/* Error */
return 0;
}
/* Buffer passed to EVP_EncryptFinal() must be after data just
* encrypted to avoid overwriting it.
*/
if(!EVP_EncryptFinal_ex(&ctx, outbuf + outlen, &tmplen))
{
/* Error */
return 0;
}
outlen += tmplen;
EVP_CIPHER_CTX_cleanup(&ctx);
/* Need binary mode for fopen because encrypted data is
* binary data. Also cannot use strlen() on it because
* it wont be null terminated and may contain embedded
* nulls.
*/
out = fopen(outfile, "wb");
fwrite(outbuf, 1, outlen, out);
fclose(out);
return 1;
如您所见, key 是实际密码,为了解码加密文件,应执行以下命令行:
openssl aes-128-ecb -in test.enc -K 000102030405060708090A0B0C0D0E0F -d
“000102030405060708090A0B0C0D0E0F”是我在上面的代码 0123456789191112131415 中使用的十六进制密码表示形式。据我所知,密码也可以使用 MD5 算法加密。
问题是如何使用从密码派生的实际 KEY 来加密数据,而不是使用 libcrypto 的密码本身?
最佳答案
看看EVP_BytesToKey .
我在旧应用程序中的评论告诉我 BytesToKey 已过时,您或许应该考虑查看 PKCS5_v2_PBE_keyivgen 或类似的。但本质上,一种高度简化的方法是从您的密码和合适的盐值中导出您的 key 作为哈希值:
EVP_DigestInit_ex(...)
EVP_DigestUpdate(...Password...)
EVP_DigestUpdate(...Salt...)
EVP_DigestFinal_ex(...)
然后您使用新生成的 key 通过以下方式派生您的 IV:
EVP_DigestInit_ex(...)
EVP_DigestUpdate(...Key...)
EVP_DigestUpdate(...Password...)
EVP_DigestUpdate(...Salt...)
EVP_DigestFinal_ex(...)
浏览 OpenSSL 源代码对于查找此类内容非常有用。
免责声明:我不是 C 程序员(有问题的应用程序是使用 OpenSSL DLL 的 Delphi),也不是安全专家,所以请将这些建议作为起点,阅读正确的文档并尽可能使用正确的函数!!.. .
关于c - 使用 KEY 的 Openssl/libcrypto AES 128 编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6908785/
我在Linux上安装了Openssl,Openssl-dev。配置Thrift时,出现以下错误: 正在检查-lcrypto中的BN_init ...否 配置:错误:“错误:需要libcrypto。”
当我尝试编译使用 openssl 'crypto' 库函数和命令行 -lcrypto 和 gcc 4.4.3 的 C 代码时> 它给出了一个错误 `@ubu:$ gcc -ggdb aes_m.c -
我正在尝试在 XCODE 4.2 上为 mac 编译一个较旧的 objective-c 应用程序 尝试编译时出现链接错误 无法直接与架构 x86_64 的/usr/lib/libssl.0.9.7.d
我正在遵循以下位置的代码示例:http://www.openssl.org/docs/crypto/sha.html# 执行以下操作后: EVP_DigestFinal_ex(&mdctx, md_v
我正在使用 libcrypto++ 进行 aes 加密。我想在我的代码中添加以下方法:EVP_CipherInit_ex()、EVP_CipherUpdate()、EVP_CipherFinal_ex
我正在尝试将一个共享库放在一起,该库向远程服务器发出 HTTP GET 请求。我的库将由另一个应用程序加载,我想将一些统计数据发布到网络服务器 API。我的代码目前看起来像这样: void conne
我以某种方式设法在 Ubuntu 14.04 上安装了 libcrypto++ 库。现在,我在 Eclipse CDT 中有一个项目,我想创建一个可执行文件并使其独立运行在其他 linux 风格和 w
我有以下生成文件,我将以静态方式添加库“libcrypto.a”。我需要这样做,因为目标系统无法安装 openssl 库。 # Environment MKDIR=mkdir
我想尝试一个带有 makefile 的程序,但是当我将 make 放入 shell 时,错误是: g++ -g -DaUNIX -I../../acroname/aInclude -I../../a
我使用以下方法创建了一个 RSA key : RSA_generate_key(2048, RSA_F4, NULL, NULL); 现在我想将公钥导出到另一方 B。现在,我刚刚存储了整个 RSA*
我使用的是 Mac OS X 10.6 SDK,并且我的部署目标设置为 Mac OS 10.5。我链接到 libcrypto(AquaticPrime 需要这个)并发现我的应用程序无法在 Leopar
我自己编译php7。 下载php7源代码。 yum安装libxml2-devel openssl-devel.i686 配置 ./configure --prefix=/usr/local/php7
我看到了这个问题“找不到包‘libcrypto’”。我几个月前修复的相同错误是遵循以下解决方案:https://github.com/scipr-lab/libsnark/issues/99 我今天尝
我需要签署一个字符串,将公钥作为字符串发布,然后在其他地方使用公钥来验证签名的消息。这是消息签名的部分: // RSA keypair generation EVP_P
我正在尝试使用 Debian Wheezy 和 g++4.7 在我的系统上编译一个程序。我希望它能够在另一个带有 Debian Squeeze 的系统上运行(并且没有最近的 g++)。我无法在 Squ
这更像是一个假设,而我正在调试一些代码。假设我有一个应用程序(称为 X)调用一个库以通过 TLS 加密的 SMTP 连接发送电子邮件,同时 X 正在与另一个库交谈,该库通过相同的 libcrypto
我正在为 Android 应用构建一个帮助程序库,我需要为我正在使用的一些支持库提供完整的 OpenSSL 实现。我正在创建一个构建链并用它编译 libssl 和 libcrypto 但在运行时我得到
我有一个 C 文件需要在 Windows7 上编译。我已经为 gcc 安装了 MinGW。我还需要 OpenSSL,因此点击他们网站上的链接并从 Shining Light Productions 下
近 3 天以来,我一直在尝试这样做。它让我发疯。 正如您想象的那样,我对 C++ 还很陌生。 任何人都可以一步一步地指导我使用 openssl 中的函数编写一个 hello world 程序,并从 W
案例: 我正在构建一个使用 libcrypto 和 libssl 的应用程序。我正在尝试使用预构建的 libcrypto.so 和 libssl.so 并编译我的应用程序。 但我不断收到 undefi
我是一名优秀的程序员,十分优秀!