温少的日志

我希望我所作的事情对别人有所帮助!
随笔 - 180, 文章 - 1, 评论 - 1076, 引用 - 5
数据加载中……

最安全的加密算法

在密码学里,有一种理想的加密方案,叫做一次一密乱码本(one-time pad)。

one-time pad的算法有以下要求:
1、密钥必须随机产生
2、密钥不能重复使用
3、密钥和密文的长度是一样的。

one-time pad是最安全的加密算法,双方一旦安全交换了密钥,之后交换信息的过程就是绝对安全的啦。这种算法一直在一些要求高度机密的场合使用,据说美国和前苏联之间的热线电话、前苏联的间谍都是使用One-time pad的方式加密的。不管超级计算机工作多久,也不管多少人,用什么方法和技术,具有多大的计算能力,都不可能破解。

一次一密的一种实现方式,如下:
public class OneTimePadUtil {
    
public static byte[] xor(byte[] bytes, byte[] keyBytes) {
        
if (keyBytes.length != bytes.length) {
            
throw new IllegalArgumentException();
        }


        
byte[] resultBytes = new byte[bytes.length];

        
for (int i = 0; i < resultBytes.length; ++i) {
            resultBytes[i] 
= (byte) (keyBytes[i] ^ bytes[i]);
        }


        
return resultBytes;
    }

}

使用例子:
String plainText = "温少";
String keyText 
= "密码";

byte[] plainBytes = plainText.getBytes();
byte[] keyBytes = keyText.getBytes();

assert plainBytes.length 
== keyBytes.length;

//加密
byte[] cipherBytes = OneTimePadUtil.xor(plainBytes, keyBytes);

//解密
byte[] cipherPlainBytes = OneTimePadUtil.xor(cipherBytes, keyBytes);


这是最简单的加密算法,但也是最安全的机密算法。前天和朋友讨论到了这个问题,所以写了这篇文章。

posted on 2005-03-27 11:28 温少 阅读(6294) 评论(12)  编辑 收藏 所属分类: .NETJava

评论

#1楼    回复  引用    

one-time pad的算法有以下要求:
1、密钥必须随机产生
2、密钥不能重复使用
3、密钥和密文的长度是一样的。(这里是不是“明文”啊?)

one-time pad是最安全的加密算法,双方一旦安全交换了密钥,之后交换信息的过程就是绝对安全的啦。
????

随机产生不可重复使用和明文文等长的密钥?有意义吗?如果可以安全交换和明文等长的密钥不如直接交换明文得了。
2005-04-07 11:01 | 过客 [未注册用户]

#2楼 [楼主]   回复  引用  查看    

@过客
假如有一天,你我见面后分离,你要到敌营窃取数据然后传送给我,面试时,我们可以先随机生成一长串密码,各自保留一份,用于以后one-time pad使用。

以现在的技术,我们随机生成的密码可以是20G,然后放在一个USB移动硬盘里,每使用一次,我们都各自删除已经使用过的密码。

嘻嘻,这样,我们的数据可以Internet传递,但不必担心被破译,就算国家安全局的破解高手也破解不了!
2005-04-08 03:00 | 温少      

#3楼    回复  引用    

工作需要,要把这段java代码翻译成net。头大啊!能帮帮忙吗?加我qq好吗?150680310
ByteArrayOutputStream baos = new ByteArrayOutputStream(8);
DataOutputStream dos = new DataOutputStream(baos);
dos.writeInt((int)y);
dos.writeInt((int)z);
dos.close();
return baos.toByteArray();
2005-06-03 06:36 | john [未注册用户]

#4楼    回复  引用    

你用了一次密码,然后要删除它,那么再要定下一次密码两个人又要碰头一次,如果如果可以这么频繁碰头,还不如在碰头的时候交换明文啊。…………
2005-06-15 11:58 | 不稳定 [未注册用户]

#5楼 [楼主]   回复  引用  查看    

@不稳定
一次交换一段很长的密码,例如100G,就可以用很长时间了
2005-06-17 00:39 | 温少      

#6楼    回复  引用    

不错。
如果接收到一个假密文,那么两端的密码就不同步了。
2005-09-09 11:37 | neoedmund [未注册用户]

#7楼    回复  引用    


是不是说,一次生成一个 密码list,然后依次使用 list[0] , list[1] , list[2] .. ?
2005-09-09 14:27 | xingde [未注册用户]

#8楼    回复  引用    

这个问题有点严重。。。。
2006-03-21 16:45 | 嘎嘎 [未注册用户]

#9楼    回复  引用    

国际上著名的密码学硬件及嵌入式设计年会的会议论文集 自1999年开始每年一届 详情请见:http://hengfeng77.51.net.
2006-11-18 22:22 | craftfox [未注册用户]

#10楼    回复  引用    

你能把你的这个代码给我吗?
我是初学者 想看看你怎么加密的
谢谢了
36507053@qq.com
2007-01-22 10:06 | 天上地下 [未注册用户]

#11楼    回复  引用    

lz太嫩了...
2007-11-16 13:53 | chaircat [未注册用户]

#12楼    回复  引用    

晕倒,异或也能叫做最安全的加密算法吗,还配不上算法二字吧。不过说是前俄罗斯的加密方式倒有可能,可以说是计算机没出现之前的加密方法。其中原理很简单,其实我们经常能在电视看到,间谍拿起一张报,翻一翻,然后就找到一个保险柜。这里他们用的就是这种加密法:约好,看当天华尔街日报,第三版,第二行开始。假如间谍收到密令:1,8,10,10,5,9,1,10。买份报纸看到三版二行是:“JabberBaby......”,约定按字母顺序解密,J后面第1个字母是K,a 后面第8个字母是I,如此,b10:L, b10:L,e5:J,r9:A,B1:C,a10:K。最后翻译出命令“Kill Jack”
2008-09-26 13:49 | chrisden [未注册用户]

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      


相关链接: