Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何从字节64编码的字符串中删除额外的填充?_C_Rsa_Public Key Encryption - Fatal编程技术网

C 如何从字节64编码的字符串中删除额外的填充?

C 如何从字节64编码的字符串中删除额外的填充?,c,rsa,public-key-encryption,C,Rsa,Public Key Encryption,我找到了类似的帖子,但这对我没有帮助。所以,我发布了一个新问题 我有一个由OpenSSL生成的1024位“private.pem”文件。我的目标是执行AES加密,然后执行AES解密操作 我阅读了“private.pem”文件并添加了必要的填充,如下所示: #define AES_BLOCK_SIZE 16 #define KEY_BUFFER_SIZE 992 unsigned char * buffer = 0; long length; FILE * fp = fopen ("p

我找到了类似的帖子,但这对我没有帮助。所以,我发布了一个新问题

我有一个由OpenSSL生成的1024位“private.pem”文件。我的目标是执行AES加密,然后执行AES解密操作

我阅读了“private.pem”文件并添加了必要的填充,如下所示:

#define AES_BLOCK_SIZE 16
#define KEY_BUFFER_SIZE 992

unsigned char * buffer = 0;
long length;
FILE * fp = fopen ("private.pem", "rb");

if (fp)
{
    fseek (fp, 0, SEEK_END);
    length = ftell (fp);
    fseek (fp, 0, SEEK_SET);
    buffer = malloc (length);
    if (buffer)
    {
        fread (buffer, 1, length, fp);
    }
    fclose (fp);
}

// padding the buffer to make it multiple of 16
if(strlen(buffer)%AES_BLOCK_SIZE == 0){
   printf("No padding needed\n");
}else{
   int k=AES_BLOCK_SIZE-(strlen(buffer)%AES_BLOCK_SIZE);
   printf("padding needed: %d\n", k );
   char ch[k];
   for (int i=0;i<k;i++){
       ch[i]='0';
}
strncat(buffer,&ch,k);

printf("After padding: Wish to see 0 here in output, strlen(buffer)/AES_BLOCK_SIZE is  %d\n", strlen(buffer)%AES_BLOCK_SIZE);
printf("Padded buffer is \n %s\n", buffer);
printf("Padded buffer size \n %d\n", strlen(buffer));
现在,我用aes_crypt_ecb对这个缓冲区进行加密,旧版本是PolarSSL。解密后,我想删除那些额外的填充(000000)。我是这样做的

unsigned char private_decrypt[KEY_BUFFER_SIZE]; /* buffer that will contain the decrypted key */
unsigned char private_plain_key[986];

/* 
   Decryption Operation
   .............
   I'm not adding the decryption code because it seems irrelevant here as decryption operation works fine 
*/

// coping the actual key length
memcpy(private_plain_key,private_decrypt,986);
printf("strlen(private_plain_key) is %d\n", strlen(private_plain_key));  // output should be 986
printf("Decrypted private key is --> \n %s \n", private_plain_key);
我的输出是:

strlen(private_plain_key) is 990
Decrypted private key is --> 
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,28BE619B36FB04DC12A4118B62222F14

RfrLwDCfQie84ixPfuRes+4KoxN1nh4GtiW/MM7K/mFcVwlXDSnydTrZSnuuGzw1
xCR2zNfIWHZb6LGzD77Wy8H56MmEJQd9Mr0EVxb+YHI0UVXvY+gtnfZcigSXA+6f
4qAWw8pXQq+qaZ7GQd/PEOyXpxVyywZQKmgit3y/ZvtbVSQO3W3eSZMVaQ3uY1tN
HUj13WvrHSOWS+YjOFKK/FMtbD+TC6bkXcyczKtGb3JudMlzke9ARGrMGsCLuWT1
XOjiHmokWpxNEfjSHK+SPSpu67+y9CXytQYMAVAxggOrzZ8rWwScrPApDO6yBiWb
DV+ti6GT64Q37NUUaFMhOFgpN9twC6ZRr56P0HDONz+51u+TiNneA+tRPsYLyIyC
urF4udhl/wU0e/mHblmeQGzfDTiemH6gXYetJrsV13Rf6QN03YpZFZzAxX1LG3IH
S7wbdA+d2g1sYP/WMUTlnkdVRMsZXC3twqXcCk35z1clWa+Zwi0ckpBXSBt66fr7
WHjCqVrzY2cqMduRArjN0ejQRM5C1AMv4r6VHWqFD7+V56LHmrI8FJcVtZBr/9FD
uwnIvQbI9j41iMtWz6p63v2hubtdpoBydEPD/JFjF02rhcVa+jJDNlihdss7wsve
efwNnMW1AlbnEtYGKK3taQsy5s4/jcJCywCRCUdtE0I8ZQN10bUa6Mxah1xZn7nE
3qvVoPoCdVgDGq03HrZqdTLINt0FTkFAjfAz+QqnUifBekNgSzeGIe/cTXWfsSF6
QDRJS4QxI0zsfrHsTRB+f4afOfwvcV4hp2lZe6Bd/4IZuJ3zf/gq5hOFRbofuBXh
-----END RSA PRIVATE KEY-----
* 

看来memcpy的应对能力比它想象的要大

所以,我有一个双重问题

  • 对于1024位RSA私钥,实际密钥字符串长度是多少?据我理解,它应该是一个固定的986大小。我说得对吗?这一直都是真的吗
  • 我怎样才能去掉那些多余的填充物?我的意思是,在不使用memcpy的情况下,我可以添加“\0”,比如private\u decrypt[992-6]='\0',假设私钥字符串长度是固定的,我已经知道我使用的确切填充**我尝试了这种方法,但当我打印缓冲区时,它 显示一个空行**

  • “看来memcpy的应对能力比它想象的要大”不是真的。Memcpy不会在字符串的末尾添加空字节(而且在private_plain_key[986]中也没有空间容纳它)。谢谢。我将其更改为未签名的char private_明文[987]。好像垃圾不见了。但仍然有一条空线。有什么建议,如何删除它?你能发布空行场景的完整输出吗?为了确认一下,现在使用private_plain_key[987]和strcpy与设置private_decrypt[286]='\0'的行为相同,对吗?我使用memcpy()。是的,在改变数组大小之后,我仍然得到相同的行为。[这是完整的输出
    strncat(缓冲区,&ch,k);
    这无法工作,因为您的缓冲区溢出了
    缓冲区。
    。它被分配为与文件大小完全相同的大小,并且您用文件将其填满。然后您尝试将某些内容连接到缓冲区,但没有剩余的空间。这也意味着缓冲区不会以零结尾,因此strncat不一定会在buff结束时停止呃。你很幸运,分配后的字节恰好是零。这段代码可能会在某个时候崩溃。
    strlen(private_plain_key) is 990
    Decrypted private key is --> 
    -----BEGIN RSA PRIVATE KEY-----
    Proc-Type: 4,ENCRYPTED
    DEK-Info: AES-128-CBC,28BE619B36FB04DC12A4118B62222F14
    
    RfrLwDCfQie84ixPfuRes+4KoxN1nh4GtiW/MM7K/mFcVwlXDSnydTrZSnuuGzw1
    xCR2zNfIWHZb6LGzD77Wy8H56MmEJQd9Mr0EVxb+YHI0UVXvY+gtnfZcigSXA+6f
    4qAWw8pXQq+qaZ7GQd/PEOyXpxVyywZQKmgit3y/ZvtbVSQO3W3eSZMVaQ3uY1tN
    HUj13WvrHSOWS+YjOFKK/FMtbD+TC6bkXcyczKtGb3JudMlzke9ARGrMGsCLuWT1
    XOjiHmokWpxNEfjSHK+SPSpu67+y9CXytQYMAVAxggOrzZ8rWwScrPApDO6yBiWb
    DV+ti6GT64Q37NUUaFMhOFgpN9twC6ZRr56P0HDONz+51u+TiNneA+tRPsYLyIyC
    urF4udhl/wU0e/mHblmeQGzfDTiemH6gXYetJrsV13Rf6QN03YpZFZzAxX1LG3IH
    S7wbdA+d2g1sYP/WMUTlnkdVRMsZXC3twqXcCk35z1clWa+Zwi0ckpBXSBt66fr7
    WHjCqVrzY2cqMduRArjN0ejQRM5C1AMv4r6VHWqFD7+V56LHmrI8FJcVtZBr/9FD
    uwnIvQbI9j41iMtWz6p63v2hubtdpoBydEPD/JFjF02rhcVa+jJDNlihdss7wsve
    efwNnMW1AlbnEtYGKK3taQsy5s4/jcJCywCRCUdtE0I8ZQN10bUa6Mxah1xZn7nE
    3qvVoPoCdVgDGq03HrZqdTLINt0FTkFAjfAz+QqnUifBekNgSzeGIe/cTXWfsSF6
    QDRJS4QxI0zsfrHsTRB+f4afOfwvcV4hp2lZe6Bd/4IZuJ3zf/gq5hOFRbofuBXh
    -----END RSA PRIVATE KEY-----
    *