- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在使用 C 中的 EVP 进行一些暴力破解一些简单文本的测试。
提供了明文、密文、 key 大小、加密方法和方法论。我们只需要尝试不同的键,即已知的字典单词。
主要问题是,如果我尝试像这样直接从 main 调用 EVP 方法:
int main(int argc, char const *argv[]) {
evp((unsigned char *)"This is a top secret.");
return 0;
}
找不到 key (无法生成相同的密码)
但是使用 clock();
的调用称为:
int main(int argc, char const *argv[])
{
clock_t begin = clock();
evp((unsigned char *)"This is a top secret.");
return 0;
}
效果很好!为什么会发生这种情况?我究竟做错了什么?有人可以解释一下问题是什么吗?
使用aes-128-cbc加密明文,iv为16字节NULL, key 为单个字典单词,长度小于16,长度小于时补空16.
以下代码用于执行整个过程:
void evp(unsigned char * plaintext) {
FILE *fp = fopen("words.txt", "r");
const char cipher[] ="8d20e5056a8d24d0462ce74e4904c1b513e10d1df4a2ef2ad4540fae1ca0aaf9";
unsigned char iv[16];
unsigned char ciphertext[256];
/**Init OpenSSL**/
ERR_load_crypto_strings();
OPENSSL_config(NULL);
OpenSSL_add_all_algorithms();
unsigned char word[17];
while(read_word(fp, word)==0) {
if(strlen((char *)word) < 16) {
add_space(word, sizeof(word));
encrypt(plaintext, strlen((char *)plaintext), word, iv, ciphertext);
if(strcmp((char *)ciphertext, cipher) == 0 ) {
printf("The key is : %s\n", word);
fclose(fp);
exit(0);
};
}
}
fclose(fp);
}
add_space
方法只是向键提供空白空间:
int add_space(unsigned char *str, size_t len) {
int eol_pos = strlen((char *)str);
int empty_space = len - eol_pos - 1 ;
//set space and eol
memset(str+eol_pos, ' ', empty_space);
memset(str+len, '\0', 0);
return 0;
}
read_word
方法从字典中读取单个单词:
int read_word(FILE *file, unsigned char * word) {
//Using fscanf
unsigned char word_buf[255];
if(fscanf(file, "%s", word_buf) != EOF) {
if( strlen( (char *)word_buf ) < 15 ) {
strcpy((char *)word,(char *) word_buf);
}
return 0;
}
return 1;
}
而encrypt
方法是对明文进行加密的主要过程:
void encrypt(unsigned char *plaintext, int plain_len ,unsigned char *key, unsigned char * iv, unsigned char * ciphertext) {
EVP_CIPHER_CTX *ctx;
int out_len;
int ciphertext_len;
char *buff;
if(! (ctx = EVP_CIPHER_CTX_new()) ) {
handleErrors();
}
if( EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv) != 1 )
handleErrors();
if( EVP_EncryptUpdate(ctx, ciphertext, &out_len, plaintext, plain_len ) != 1 ) {
handleErrors();
}
ciphertext_len = out_len;
if( EVP_EncryptFinal_ex(ctx, ciphertext+out_len, &out_len) != 1 ) {
handleErrors();
}
ciphertext_len += out_len;
EVP_CIPHER_CTX_cleanup(ctx);
buff = malloc(ciphertext_len*2+1);
memset(buff, 0, ciphertext_len*2+1);
for (int i = 0; i < ciphertext_len; ++i)
{
char tmp[3];
sprintf(tmp, "%02x", ciphertext[i]);
strcat(buff, tmp);
}
strcpy((char *)ciphertext, buff);
free(buff);
}
最佳答案
您实际上从未将 iv
设置为任何内容。由于 iv
是局部变量,因此其内容未初始化,随后读取它会导致未定义的行为。
当您调用clock
时可能发生的情况是,该函数使用的堆栈空间可能会在堆栈上的某个位置留下一些空字节,而这些字节恰好位于iv
的位置当调用加密
函数时,code>将驻留。但是,您不能依赖此行为。
将iv
初始化为全零。然后你就会得到你期望的行为。
unsigned char iv[16] = { 0 };
关于c - 实现 openssl evp 加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41917766/
我正在尝试解密使用 EVP 中的 AES_128_cbc() 加密的密文,该密文存在于名为 task3.bin 的文件中。我正在尝试进行模拟解密试验,这意味着解密未使用正确的 key 或iv,但长度有
我在使用来自 openssl/evp.h 的高级信封解密时遇到问题 当我尝试使用相同的值多次运行同一程序时,EVP_OpenFinal 和 EVP_OpenInit 随机失败。我最近 5 天都在努力,
我在 C++ 中使用 Openssl EVP。不知何故获取标签失败。 我的代码: int do_crypt(FILE *in, FILE *out){ unsigned char inbuf[
我目前正在使用 C 中的 EVP 进行一些暴力破解一些简单文本的测试。 提供了明文、密文、 key 大小、加密方法和方法论。我们只需要尝试不同的键,即已知的字典单词。 主要问题是,如果我尝试像这样直接
当我运行以下代码时,它生成一个 key ,将其写入一个字符串,打印它,将其读入 key ,然后再次打印,针对 OpenSSL_1_0_2e: #include #include #include
在将 sources.list 中的版本设置为 7.0 后,我在我的 Debian 6.0 上安装了以下软件包: libssl-dev 打开SSL openssl-common 我已经验证了 /usr
我正在尝试在小型应用程序中实现一些基本的 AES/DES 加密/解密。主要用于存储敏感的用户信息。 我看过很多C实现的例子,这正是我想要的,因为以后在Objective-C中使用它很容易,但我不能真正
我的想法是在客户端服务器模型中进行文件加密,我使用 openssl evp 进行加密。我需要将密文存储在文本文件中并将其发送给客户端。但我无法执行此操作,因为我发现密文中存在无效字符,无法存储在文件中
我正在做一项作业,我必须比较使用 C 语言中的 OpenSSL EVP 库对无碰撞 MAC 进行的暴力攻击与单向属性 MAC 的攻击。只是澄清一下,我不是寻找有关任务的任何帮助,只是执行 EVP。 我
我正在尝试使用 RSA 及其高级信封函数通过 OpenSSL 进行公共(public)加密。但是,我似乎无法理解它们,并且遇到了段错误。我项目中的这段压缩代码重现了这个问题: #include #i
亲爱的,我制作了 c++ 代码来签署消息 m_digestData[DATA_SIZE + RSA_KEY_SIZE]。这些消息最初由一些长度为 13 字节的数据和长度为 RSA_KEY_SIZE 2
我有一个 EVP 加密文件,我想通过套接字发送它。但是,我意识到没有发送任何内容,因为我将文件读入的数组中似乎没有存储任何内容,我确信其中存储了一些内容,因为我在读取此文件后能够解密。 下面的代码片段
我正在尝试使用 heartbleed 补丁 ( 1.0.1g ) 将我的网络服务器更新到最新的 openssl。我从 openssl.org 抓取了 tarball。表示通常的./configure;
我在尝试使用OpenSSL文档中的evp aes加密模板代码时遇到很多LINK错误:https://wiki.openssl.org/index.php/EVP_Symmetric_Encryptio
因此,我尝试使用椭圆曲线 DH 的 OpenSSL EVP 方法执行 key 交换,以派生共享 key 。这对于在 GCM 模式下使用 AES 为自定义协议(protocol)提供强大的安全性是必要的
我在文档中找到的所有示例都是使用公钥加密,然后使用私钥解密。 因此,我可以使用 EVP_XXX api 用公钥解密吗?或者使用公钥解密的唯一方法是使用 RSA_XXX api? 欢迎任何答案。 最佳答
过去几天我一直在尝试将 OpenSSL 与 QT 结合使用,但文档和示例很少或没有。 无论如何,我想出了这段代码: void qkCrypto::AES_CBC(const unsigned char
所以我花了几个小时浏览谷歌搜索结果和一些与 openssl 函数相关的联机帮助页,试图找出如何使用 EVP 函数和 3DES 加密。现在我的代码正在使用 中的这些函数: DES_ede2_cbc_e
我需要使用 AES-CBC 加密长期存在的网络数据流。我在想我会调用EVP_EncryptInit_ex()只需一次并保存 E VP_CIPHER_CTX用于后续调用 EVP_EncryptUpdat
我使用 android ndk build 成功编译了 openssl,并且成功构建了 .so 文件。 我正在尝试在 android 项目中“包含”构建的 .so 文件。 在下面一行中出现错误: #i
我是一名优秀的程序员,十分优秀!