ASCII的Java Regex范围

时间:2012-04-03 12:17:28

标签: java regex cryptography

重新提出问题,因为我似乎不够具体;

鉴于RSA系统 p = 263, q = 587,公钥 e = 683且私钥 d = 81599.因此 n = pq = 154381.对于一条消息,说“我是学生”,加密操作如下:< / strong>

  • 将任何字母(包括空格)转换为3位ASCII码,即073 032 065 077 032 065 032 083 084 085 068 069 078 084。
  • 加入每两个相邻的ASCII码组成一个块,即073032 065077 032065 032083 084085 068069 078084.(如果上一个字母没有任何内容可以加入,则使用000)。
  • 使用加密算法 c = m e mod n 加密每个块; c 1 = 73032 683 mod 154381 = 103300等

假设您是消息的接收者:33815872282353670979238213794429016637939017111351。内容是什么?

经过多一点考虑之后,我想,因为我必须解码部分,即解码33815然后解码87228等等。我应该将解码部分分成两半,并检查每一半是否是在ascii范围内,如果没有,请返回原始版本并以不同方式拆分。这听起来比使用正则表达式破解一些更好的解决方案吗?

P.S。解码被认为是家庭作业,我已经手工完成了,并且知道该消息解码为“我讨厌加密”(看来我的讲师有幽默感),所以你不帮我做作业。把它变成一个程序只是一些我认为可能有趣/有趣的课外活动。

1 个答案:

答案 0 :(得分:0)

在没有分隔符或索引的情况下拥有可变长度记录通常是一个非常糟糕的主意。在这种情况下,最好的方法是使用固定宽度的整数,前导零。

那就是说,你实际上有一个隐式分隔符,假设你总是从字符串的开头到结尾读取而根本没有跳过。如果用0或1表示它是3位数字,用2-9表示2位数字。像这样的东西会起作用:

[01][0-9][0-9]|[2-9][0-9]

但实际上 - 只需将数字打印到带有前导零的字符串中即可。如果您担心空间,请查看2个字符的十六进制编码。或Base 64,或其他可打印编码之一。