C++加密算法不产生特殊字符并且密文长度不能大于明文

ruoxi520chenxi 2018-10-13 05:02:03
如题,我现在的解决方案加密后会产生特殊字符经过Base64编码之后长度就会边长,大佬些有木有好的解决方案能把我的Base64编码变长再压缩回去
...全文
422 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-10-17
  • 打赏
  • 举报
回复
请先精确定义啥叫特殊字符。对照下面程序生成的goal.bmp:
#pragma comment(lib,"gdi32")
#include <windows.h>
#include <stdio.h>

int main() {
const DWORD uWidth = 18 + 17 * 256, uHeight = 18 + 17 * 128;

PBITMAPINFO pbmi = (PBITMAPINFO) LocalAlloc (LPTR, sizeof (BITMAPINFOHEADER) + sizeof (RGBQUAD) * 2);
pbmi->bmiHeader.biSize = sizeof (BITMAPINFOHEADER);
pbmi->bmiHeader.biWidth = uWidth;
pbmi->bmiHeader.biHeight = uHeight;
pbmi->bmiHeader.biPlanes = 1;
pbmi->bmiHeader.biBitCount = 1;
pbmi->bmiHeader.biSizeImage = ((uWidth + 31) & ~31) / 8 * uHeight;
pbmi->bmiColors[0].rgbBlue = 0;
pbmi->bmiColors[0].rgbGreen = 0;
pbmi->bmiColors[0].rgbRed = 0;
pbmi->bmiColors[1].rgbBlue = 255;
pbmi->bmiColors[1].rgbGreen = 255;
pbmi->bmiColors[1].rgbRed = 255;

HDC hDC = CreateCompatibleDC (0);
void * pvBits;
HBITMAP hBitmap = CreateDIBSection (hDC, pbmi, 0, &pvBits, NULL, 0);
SelectObject (hDC, hBitmap);
HFONT hFont = CreateFont (16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "宋体");
// HFONT hFont = CreateFont (16, 0, 0, 0, 0, 0, 0, 0, SHIFTJIS_CHARSET, 0, 0, 0, 0, "宋体");
SelectObject (hDC, hFont);
BitBlt (hDC, 0, 0, uWidth, uHeight, NULL, 0, 0, WHITENESS);

char c[4];
int i, j;
for (i = 128; i < 256; i++) {
sprintf (c, "%02X", i);
TextOut (hDC, 1, (i - 127) * 17 + 1, c, 2);
}
for (j = 0; j < 256; j++) {
sprintf (c, "%02X", j);
TextOut (hDC, (j + 1)* 17 + 1, 1, c, 2);
}
for (i = 128; i < 256; i++) {
for (j = 0; j < 256; j++) {
c[0] = (char) i;
c[1] = (char) j;
TextOut (hDC, (j + 1) * 17 + 1, (i - 127) * 17 + 1, c, 2);
}
}
for (i = 0; i < 130; i++) {
MoveToEx (hDC, 0, i * 17, NULL);
LineTo (hDC, uWidth, i * 17);
}
for (j = 0; j < 258; j++) {
MoveToEx (hDC, j * 17, 0, NULL);
LineTo (hDC, j * 17, uHeight);
}

BITMAPFILEHEADER bmfh;
bmfh.bfType = *(PWORD) "BM";
bmfh.bfReserved1 = 0;
bmfh.bfReserved2 = 0;
bmfh.bfOffBits = sizeof (BITMAPFILEHEADER) + sizeof (BITMAPINFOHEADER) + sizeof (RGBQUAD) * 2;
bmfh.bfSize = bmfh.bfOffBits + pbmi->bmiHeader.biSizeImage;

HANDLE hFile = CreateFile ("goal.bmp", GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0);
if (hFile != INVALID_HANDLE_VALUE) {
DWORD dwWritten;
WriteFile (hFile, &bmfh, sizeof (BITMAPFILEHEADER), &dwWritten, NULL);
WriteFile (hFile, pbmi, sizeof (BITMAPINFOHEADER) + sizeof (RGBQUAD) * 2, &dwWritten, NULL);
WriteFile (hFile, pvBits, pbmi->bmiHeader.biSizeImage, &dwWritten, NULL);

CloseHandle (hFile);
}

DeleteObject (hFont);
DeleteObject (hBitmap);
DeleteDC (hDC);
LocalFree (pbmi);

return 0;
}

srhouyu 2018-10-16
  • 打赏
  • 举报
回复
这不可能。二进制数据中只有三分之一是可显示字符。你的需求等于是“保证将数据加密并压缩至1/3以下”。 假如这种算法存在,岂不是任意长数据都能压缩到1bit了。
赵4老师 2018-10-16
  • 打赏
  • 举报
回复
电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址;
人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……
ckc 2018-10-16
  • 打赏
  • 举报
回复
明文是中文加密后也是中文还想不增加长度?
平安前一阵子产品经理和程序员打架的新闻你去了解一下?
你的中文是gb2312还是gbk还是utf8里的?
可以把中文看成一个序列,比如总数是10000的中文集,把这10000个从1排到10000,编个号
再用另一种方法产生一个序列每一个数值最好大一些,比如也是10000
加密第一个字的时候就用这个字的编号加上这个序列,对10000取余,密文就是这个结果对应编号的汉字
这个方法可以实现你的需求,只要序列靠谱,不会被人找到规律,那么加密也是靠谱的
明文和密文长度也是相同的,不过要注意如果混有ascii码或者是utf8这样不定长的编码需要注意,可以对相同长度的编码分组进行处理
最后,不知道什么场合,为什么要求明文密文长度一致?这个算是很无聊的需求了
ruoxi520chenxi 2018-10-15
  • 打赏
  • 举报
回复
引用 5 楼 LCL_data 的回复:
so 是来问哪种加密算法符合你的要求的?
是的,如果已经有这种加密方法就更好了,没有的话只能自己慢慢去实现它了
ruoxi520chenxi 2018-10-15
  • 打赏
  • 举报
回复
引用 4 楼 ckc 的回复:
以前是字母数字这些希望加密之后也是这些可视字符? 有点难,现在靠谱一点的加密算法都是分组加密的,这样明文空间和密文空间才可以足够大。 如果你不要求绝对不增加密文长度的话可以这样试一下 相对正常算法来说你是缩小的明文空间和缩小的密文空间,比如1个字256种可能你假设你只用了64种 那你在加密之前可以先把这64映射到256,这样就相当于压缩过了,加密后再把256映射到64 长度跟你原始的是差不多的,当然因为是分组加密,可能会多些零头 如果你要求长度绝对不能超长,那可以试下替代加密,就是用一个足够长的密钥序列一对一映射你的明文和密文,只要密钥序列足够长而且没有统计规律,这种加密方法也是很靠谱的,而且长度跟你原始长度相同
但是中文的话不好解决啊
ckc 2018-10-14
  • 打赏
  • 举报
回复
以前是字母数字这些希望加密之后也是这些可视字符?
有点难,现在靠谱一点的加密算法都是分组加密的,这样明文空间和密文空间才可以足够大。
如果你不要求绝对不增加密文长度的话可以这样试一下
相对正常算法来说你是缩小的明文空间和缩小的密文空间,比如1个字256种可能你假设你只用了64种
那你在加密之前可以先把这64映射到256,这样就相当于压缩过了,加密后再把256映射到64
长度跟你原始的是差不多的,当然因为是分组加密,可能会多些零头

如果你要求长度绝对不能超长,那可以试下替代加密,就是用一个足够长的密钥序列一对一映射你的明文和密文,只要密钥序列足够长而且没有统计规律,这种加密方法也是很靠谱的,而且长度跟你原始长度相同
十八道胡同 2018-10-14
  • 打赏
  • 举报
回复
so 是来问哪种加密算法符合你的要求的?
smwhotjay 2018-10-13
  • 打赏
  • 举报
回复
AES DES 定长加密。
赵4老师 2018-10-13
  • 打赏
  • 举报
回复
要知道,通常的加密都是针对字节的 。
ruoxi520chenxi 2018-10-13
  • 打赏
  • 举报
回复
或者有木有哪种加密算法本省就不会产生特殊字符,是加密算法不是编码方法

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧