C 如何从字节64编码的字符串中删除额外的填充?
我找到了类似的帖子,但这对我没有帮助。所以,我发布了一个新问题 我有一个由OpenSSL生成的1024位“private.pem”文件。我的目标是执行AES加密,然后执行AES解密操作 我阅读了“private.pem”文件并添加了必要的填充,如下所示: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
#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的应对能力比它想象的要大 所以,我有一个双重问题
“看来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-----
*