---加密算法问题 ---

玄之丞 2005-07-11 02:56:55
二个可显示字符串,
如何加密成一个可显示字符串,

要可还原.
且不能溢出(要用PHP实现,一溢出,PHP就舍掉)

请大家帮帮忙.
...全文
307 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
玄之丞 2005-07-15
  • 打赏
  • 举报
回复
呀,感谢,

为什么我没想到呢?

谢谢大家.
玄之丞 2005-07-14
  • 打赏
  • 举报
回复
顶.
boxban 2005-07-14
  • 打赏
  • 举报
回复

抱歉,前面关于加解密流程部分写错了。更正如下:
i = 0;
for each char M in plain-text
{
t = Map_S2T[key[i++]] % TABLES;
M' = Map_T2S[ Encode_Maps[t][Map_S2T[M]] ];
if (i == length-of-key) i = 0;
}
解密部分做类似修改。
另外,为提高效率,可以对 t 序列进行预计算放入一个数组,避免重复计算:
int table_index[MAX_KEY_LENGTH];
for (int i = 0; i < length-of-key; ++i)
table_index[i] = Map_S2T[key[i++]] % TABLES;
这样,在加解密时:
t = table_index[i];

如果你愿意把问题进一步复杂化,还可以再加入一些小变换 :)。

补充:
1)
设 minCh,maxCh 分别为集合S中的最小值和最大值,
如果可能出现的可打印字符个数 == maxCh - minCh + 1,
则可以省却 Map_T2S 和 Map_S2T 两张映射表,相应的映射操作转化为 +/- minCh 的运算。

2)
写一个小程序专门用来生成加解密映射表,否则眼睛会累瞎的 ;)

boxban 2005-07-14
  • 打赏
  • 举报
回复
可以通过使用多张密文映射表的方式加强密码强度。

将明文字符集合S(N)一一映射到数字序列T(N),
并建立一张这样的从"字符" 到数字 0~N-1 的标准映射表:
int Map_S2T[max(S)] = {...}; 其中:0 <= Map_S2T[x] < N
和一张标准逆映射表:
char Map_T2S[N] = {...};


然后再随机生成若干个打乱的“标准逆映射表”,作为加密映射表
char Encode_Maps[TABLES][N] = { {....}, {....} ...};
再根据加密映射表,生成相应的解密映射表:
char Decode_Maps[TABLES][N] = { {....}, {....} ...};

这两张表的对应关系如下:
X' = Encode_Maps[t][X]; // X >= 0 && X < N
X = Decode_Maps[t][X']; // X' >= 0 && X' < N



加密过程如下:
i = 0;
for each char M in plain-text
{
M' = Map_T2S[ Encode_Maps[key[i++] % TABLES][Map_S2T[M]] ];
if (i == length-of-key) i = 0;
}

在加密过程中,循环使用Key中的每个字符作为当前明文的密钥,并通过key[i]决定
使用密文映射表中的那一张将明文字符 M 映射为 M' 。
经过这样的运算,我们就得到了一个基于多表字符映射的密文。
该加密的一个优点是:在同一个明文序列中的相同字符因其出现位置不同可以被映射
为不同的密文字符;同样,不同的字符也有可能被映射成相同的密文字符。
例如对于明文序列"aabc",若用key="xyz"加密,由于第一个a和第二个a会被选择使用
不同的密文映射表(分别对应于由'x'和'y'选定的映射表),因此会得到不同的密文字符。
但对于相同的明文序列,相同的Key,得到的加密结果却必然是相同的。

解密过程与此类似(加密方与解密方必须拥有相同的映射表):
i = 0;
for each char M' in encoded-text
{
M = Map_T2S[ Decode_Maps[key[i++] % TABLES][Map_S2T[M']] ];
if (i == length-of-key) i = 0;
}

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
TABLES大小的选择
TABLES大小最好选为:2^log(N/2) 。(log以2为底).
例如,如果 N = 100, 则 TABLES = 32
我的考虑:
1。加密映射表的表下标= t % TABLES. 其中 0 <= t < N.
采取这个大小可以增加不同字符映射到相同加密映射表的几率,
从而避免不同字符总是映射到不同的加密映射表。我觉得这样可以增加破解难度

2。取TABELS为2的次幂,可以优化取模运算。
下标 = t & (TABLES - 1);

~~~~~~~~~~~~~~~~~~~~~~~~
为了解决“但对于相同的明文序列,相同的Key,得到相同加密结果”的问题,可以
采取标准CBC(cipher-block chaining )机制,通过引入一个初始化向量IV解决这个
问题。
对于这个问题,IV可以是一个随机产生的单字符。至于IV的传递,可以有几种选择:
1。作为Key的第一个字符或最后一个字符。
2。在明文首部添加一个随机字符,解密方完成解密后丢弃第一个字符。
3。通过其他途径传递给解密者

关于CBC的具体实现方式,可以参考相关文献。
OpenHero 2005-07-14
  • 打赏
  • 举报
回复
没有看清题目
可以用字典
beyondtkl 2005-07-14
  • 打赏
  • 举报
回复
自己應該可以寫一個 一一映射 或 其它可以。。
寻开心 2005-07-14
  • 打赏
  • 举报
回复
问题:
三个全等长度的字符串
str1 是明文,
str2 是密匙
str3是密文
是吗?

可以这样,使用:
((a*b)+c)%d
的方式

执行步骤是,建立一个表,假定包含全部字母a...z,0-9, 一共36个 :

0 1 2 3 4 5 ..... 25 26 ... 35
a b c d e f g h z 0 ... 9

对于str1当中的每个字母,查询表格,找到对应的索引,作为上面公式当中的a
b选择一个素数,大于36的,比如是101
c是str2当中的对应字母,在表格当中的索引
d就是表格的长度36
计算得到的结果,查询表格,找到对应的字母显示就是了

比如str1 = "abcde"
str2 = "fedcb"
查表后, str1 对应 0 1 2 3 4
str2 对应 5 4 3 2 1
根据 (a*b+c)%d
str1 str2 运算结果 查表得到的str3
(0 *101 + 5) %36 = 5 f
(1 *101 + 4)%36 = 33 7
(2 *101 + 3)%36 = 25 z
(3 *101 + 2)%36 = 17 p
(4 *101 + 1)%36 = 9 j

寻开心 2005-07-14
  • 打赏
  • 举报
回复
你把问题重新完整的描述出来吧
寻开心 2005-07-13
  • 打赏
  • 举报
回复
b是一个大的素数,至少要大于35的
玄之丞 2005-07-13
  • 打赏
  • 举报
回复
re happy__888([顾问团]寻开心)

(a*b)%c

2*5 %35 = 10
9*5 %35 = 10

这样的话逆解的时候会出错呀.
玄之丞 2005-07-13
  • 打赏
  • 举报
回复
re happy__888([顾问团]寻开心)

可 密匙b, 也要求是可显示的字符串 32-126 (是由用户指定的.)

不行..继续求..


寻开心 2005-07-12
  • 打赏
  • 举报
回复
md5不可以,md5变换后是128位的结果, 不可以逆转

把a_z, 0_9这36个字母编码为0,1,。。。,35
然后利用(a*b)%c的方式,b为素数就是密匙 a为编码,c=35
mdj_boy 2005-07-12
  • 打赏
  • 举报
回复
mark...
玄之丞 2005-07-12
  • 打赏
  • 举报
回复
re OpenHero(雨流星)
md5的话,无法逆向呀.
而且我的长度不变是指,生成后的字串与原字串长度相同呀.

re oyljerry(【勇敢的心】→ ㊣X-Monsieur㊣)
字符递增的话,私钥就没用了.
另外多试几次,就被破了,

继续求,大家多多帮忙
oyljerry 2005-07-11
  • 打赏
  • 举报
回复
要不就字符递增或别的复杂的叠加,超过了就从头重新循环
OpenHero 2005-07-11
  • 打赏
  • 举报
回复
要不用md5加密~~
这样既有唯一标示了~~~
而且长度不变~
OpenHero 2005-07-11
  • 打赏
  • 举报
回复
一般都是用字典~~

玄之丞 2005-07-11
  • 打赏
  • 举报
回复
re jsjjms(我不是仅仅会打字)
这样的我也想过,不过私钥要求只有一个,
等于加密表格只有一行,如果这样的加密,破解起来太简单了.

re 6spring(6Spring)
先加密成二进制,再转为Hex或Base64。
方法是不错,就是长度上有点问题,
加密后的字符串要求和原字符串长度相等.

还有什么好点的方法.
只要说下原理就行.不要代码.


谢谢.
ice_river_feng 2005-07-11
  • 打赏
  • 举报
回复
网上,随便找一个加密算法都可以实现你的想法。
google一下就可以找到
jsjjms 2005-07-11
  • 打赏
  • 举报
回复
偶以前做过一个。

可以参考
a b c d e f g......
b c d e f g a
c d e f g a b
d e f g a b c
e f g a b c d
f g a b c d e
g a b c d e f
.
.
.

设置这样一张加密表格
然后 要加密的数据算行,密钥算列,比较一下就可以得出。
解密的时候也很方便。当然加密表格需要你自己设置。
我设置的这个是随便写的。
加载更多回复(5)

64,654

社区成员

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

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