Tag: 加密

堆腐败 – Android原生代码中的SEGV_MAPERR

我正在尝试为流AES加密创建一个小型库,我开始基于Facebook Conceal项目( https://github.com/facebook/conceal )开展我的工作,只是更改了一些内容并改进了本机的包装以支持密码用填充物。 它工作正常,它可以解密文件没有问题,但是当我处理大流时,我得到随机的堆内存损坏,经过大量的时间调试,我一直无法找到错误。 这是我的代码: https://gist.github.com/frisco82/9782725 我试图找到内存分配或免费问题,但几乎没有malloc或free,而jni调用应该是安全的,openssl也是如此(我编译了自己但隐藏提供的也失败了) CheckJni没有任何警告,虽然上下文处理有点开箱即用,但它看起来并没有破坏(事实上Android的密码似乎使用了类似的东西)。 此外,如果有人可以指向我的Android本机AES多步骤(多个更新调用)库,我将切换到那个并忘记这一点。 错误时常变化,但通常与他的相似: 03-26 10:33:02.065: A/dalvikvm(2475): @@@ ABORTING: DALVIK: HEAP MEMORY CORRUPTION IN mspace_malloc addr=0x0 03-26 10:33:02.065: A/libc(2475): Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1), thread 2494 (AsyncTask #1) 03-26 10:33:02.205: I/DEBUG(933): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** […]

从gcry_cipher_decrypt确定解密数据的大小?

我正在使用AES / GCM,但以下是其他模式的一般问题,如AES / CBC。 我对libgcrypt进行了以下调用: #define COUNTOF(x) ( sizeof(x) / sizeof(x[0]) ) #define ROUNDUP(x, b) ( (x) ? (((x) + (b – 1)) / b) * b : b) const byte cipher[] = { 0xD0,0x6D,0x69,0x0F … }; byte recovered[ ROUNDUP(COUNTOF(cipher), 16) ]; … err = gcry_cipher_decrypt( handle, // gcry_cipher_hd_t recovered, // void * COUNTOF(recovered), […]

这种mlockall的用法是否正确?

下面的程序XORs 2文件使用一次填充加密创建输出文件。 我试图使用mlockall ,以避免从外部内存源获取密钥文件时硬盘上留下任何密钥文件的痕迹。 从mlockall手册页: mlock() and mlockall() respectively lock part or all of the calling process’s virtual address space into RAM, preventing that memory from being paged to the swap area. 我如何检查它是否正常工作并且我正确使用了mlockall ? #include #include #include #include int main(int argc, char **argv) { struct stat statbuf; struct stat keybuf; char buffer [20]; int key; […]

不兼容的AES实施?

我已经从这个站点编译了一些AES实现代码,它应该是128位密钥加密。 我测试了一起工作正常的加密/解密程序。 但是,如果我用上面提到的代码加密任何东西,然后尝试通过linux内置的openssl工具解密它,我就是无法解密它,它甚至会记录我的错误幻数错误。 同样,如果我使用openssl加密任何东西并尝试使用代码解密将无法正常工作。 我试过用cbc ecb。 如果他们都在实施AES,它不应该以同样的方式工作吗?

RSA加密的OpenSSL可变长度结果

我正在尝试使用OpenSSL的RSA加密function加密一些文本。 我的主要问题是加密的RSA文本的长度在0到256之间变化。 我的RSA加密function是: /* Encrypt data using RSA */ char* rsa_encrypt(char* pub_key_filename, const unsigned char *data) { int padding = RSA_PKCS1_PADDING; FILE *fp_pub; fp_pub = fopen(pub_key_filename, “rb”); if (fp_pub == NULL) { printf(“There was an error opening the public key file. Exiting!\n”); exit(EXIT_FAILURE); } RSA *pub_key = PEM_read_RSA_PUBKEY(fp_pub, NULL, NULL, NULL); char *encrypted = malloc(2048); […]

需要加密一个文件,我把它全写,但读取文件时出错

#include #include #include int encrypt_data(FILE *); int main(void) { FILE *fp; int return_code; printf(“Please enter the file to be encrypted: “); char filename[200]; fgets(filename, 200, stdin); fp=fopen(“filename”,”w+”); return_code = encrypt_data(fp); return 0; } int encrypt_data(FILE *disk_fp) { int i; unsigned long int file_size; int key_length; char *file_buff = NULL; char key[] = “12`3-vk0fn”; key_length = […]

编写密码程序

编写一个程序(filter),从标准输入读取ASCII流并将字符发送到标准输出。 该程序丢弃除字母以外的所有字符。 任何小写字母都以大写字母输出。 以空格字符分隔的五个组中的输出字符。 每10组后输出一个换行符。 (一行中的最后一个组仅跟随换行符;一行上的最后一个组后面没有空格。)最后一组可能少于五个字符,最后一行可能少于10个组。 假设输入文件是任意长度的文本文件。 为此使用getchar()和putchar()。 您永远不需要一次在内存中包含多个输入数据字符 我遇到的麻烦是如何做间距。 我创建了一个包含5个对象的数组,但我不知道如何处理它。 这是我到目前为止: #include #include #include int main() { char c=0, block[4]; while (c != EOF) { c=getchar(); if (isupper(c)) { putchar(c); } if (islower(c)) { putchar(c-32); } } }

澄清OpenSSL中的EVP_BytesToKey()函数

我在看这个页面: http : //www.openssl.org/docs/crypto/EVP_BytesToKey.html 在那里,它说: 如果总密钥和IV长度小于摘要长度并且使用MD5,则推导算法与PKCS#5 v1.5兼容,否则使用非标准扩展来导出额外数据。 我正在使用AES-256-CBC密码和MD5。 从上面的摘录判断,这告诉我什么? 这是否意味着我与PKCS#5 v1.5兼容,或者它是否意味着它使用了一些非标准的东西?

来自openssl的CMS加密/解密损坏

所以我导航到openssl的demos文件夹中 /usr/share/doc/libssl-doc/demos/cms 我在那里编译了测试文件 gcc cms_enc.c -o enc -lssl -lcrypto gcc cms_dec.c -o dec -lssl -lcrypto 然后我首先开始他们两个./enc然后./dec。 不幸的是发生了以下错误 140502142240416:error:0200B009:system library:fread:Bad file descriptor:bss_file.c:245: 140502142240416:error:20082002:BIO routines:FILE_READ:system lib:bss_file.c:246: 140502142240416:error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block length:evp_enc.c:532: 那么这意味着openSSL中的CMS实现已经被打破了? 我想将这个function用于我自己的c ++程序,但它失败了所以我想试试即使这些例子都有效。

如何使用逐位XOR加密文本文件?

我试图通过使用来自另一个文件(keys.txt)的两个特定键的左右字符的逐位XOR操作来加密来自文本文件的消息,但是我在原始文本前面接收到不可读的代码文件(没有改变),这是不对的。 我使用两个文本文件: 1)Input.txt – 包含要加密的消息 2)Keys.txt – 包含两个字符,对input.txt中的每个字符执行XOR操作(字符1是键1,字符2是键2) 我的程序中的以下代码: str[i]=str[i]^str2[2]; str[++i]=str[i]^str2[1]; break; 是要执行XOR操作的代码行 注意我想要的输出应该类似于: m @#EmI(> 9S(@)H#FmN#XGmmmmU,H!Gmr(DmI“VmD,F(S!XmU%DmM”C> U(S>,O)9I(9T?U!D>, M!,E; @#B(Gmu%D4,S(:@ $ U $ O *“OmU%DmR%H#F!D`V $ M!4N8.N Dm @#EmK”H#9I(+ MMMM)@#B(F 有人可以澄清我遇到的问题吗? 用户应输入: gcc myProgram.c ./a.out e input.txt keys.txt (e只代表加密) #include #include #include int main(int args, char *argc[]){ int i; int len=0; char str[1024]; char str2[2]; […]