加密解密-DES算法和RSA算法

昨天忽然对加密解密有了兴趣,今天上班查找了一些资料,现在就整理一下吧:)



一.DES算法



这种算法如图所示,这里将描述它的每一个步骤。这个算法进行了16次迭代(圈),把各块明文交织起来与

从密钥中获得的值混合。这个算法就像织线的织布机一样。明文被分成两根线,密钥就像染料一样在每一圈中

改变线的颜色。结果是一个五颜六色织好的图案。

********** **********

*原始消息 * * 密钥 *

**********

********** || ||

|| || ||

|| ******** ********

********** ********** ********** 3 28位左* *28位右*

* * * * * * *半边 * *半边 *

******** ********

* * * * * * || ||

********** ********** ********** || ||

|| ******** ********

|| *循环移* *循环移*

********** 4 位左边* *位右边*

1 *初始排列* ******** ********

********** || ||

|| || || ||

|| || ******************

2 ********* ********** *排列并扩展到48位*

*左边32位* *右边32位* ******************

********* **********

||

||

**********

*扩展/排列* 5

**********

||

**********

* XOR * 6

**********

||

************

*转换到32位* 7

************

||

**********

* XOR * 8

**********

9

********** **********

*新的左边* *新的右边*

********** **********

||

|| 10 重复超过15次迭代

**************

*翻转初始排列* 11

**************

||

64位明文

下面的例子介绍有关如何把明文和密钥织到一起的一些概念。这里略去复杂的细节(偷懒了吖,俺打字很累的

),有需要的各位大虾可再查询相关资料。

(1)对64位的明文进行修改(排列)以改变位的次序。

(2)接下来,把明文分成两个32位的块左右各32次。

(3)在上图中的密钥一边,原始密钥被分成两半。

(4)密钥的每一半向左循环移位,然后重新合并、排列并扩展到48位。分开的密钥仍然保存起来供以后的

迭代使用。

(5)在上图的明文一边,右侧的32位块被扩展到48为,以便与48位的密钥进行XOR的操作,在这一步还要

进行另一次排列。

(6)把第3步和第5步的结果(明文与密钥)进行XOR操作。

(7)使用置换函数把第6步的结果转换成32位。

(8)把第2步创建的64位值得左边一半与第7步的结果进行XOR操作。

(9)第8步的结果和第2步创建的右半部分共同组成一个新块,前者在右边,后者在左边。

(10)从第4步开始重复着一过程,共迭代15次。

(11)完成最后一次迭代后,对这个64位块进行1此翻转,得到三个64位的密文。

对原始的明文中下一个64位块重复整个过程。注意,为了简洁起见,省略了整个过程的许多复杂细节。

对于DES一直有许多争论。最大的问题是它可能与一个未知的弱点,或者只为NSA所知的弱点。另外还存在

暴力攻击的可能性。所谓暴力攻击是指花费大量钱财,使用很多处理能力以破译密码。有些人认为NSA早已具备

这种潜力。原来DES建议的密钥大小为64为,只是在它被批准成为标准前被减少到56为。有人认为减少密钥的长

度使得美国政府可以使用RSA功能强大的计算机系统破译密码。

DES是第一个公开使用的算法,之后还有许多种块密码的方法。如IDEA等,有兴趣的朋友可自行参阅其他资

料。

用C#实现Des加密和解密

using System;

using System.IO;

using System.Security.Cryptography;


namespace Vavic

{

 /**//// <summary>

 ///用C#实现Des加密和解密

 /// Security 的摘要说明。

 /// </summary>

 public class Security

 {

  const string KEY_64 = "VavicApp";

  const string IV_64 = "VavicApp"; //注意了,是8个字符,64位



  public Security()

  {

   //

   // TODO: 在此处添加构造函数逻辑

   //

  }


  public static string Encode(string data)

  {

   byte[] byKey = System.Text.ASCIIEncoding.ASCII.GetBytes(KEY_64);

   byte[] byIV = System.Text.ASCIIEncoding.ASCII.GetBytes(IV_64);


   DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider();

   int i = cryptoProvider.KeySize;

   MemoryStream ms = new MemoryStream();

   CryptoStream cst = new CryptoStream(ms,cryptoProvider.CreateEncryptor(byKey,byIV),CryptoStreamMode.Write);

   

   StreamWriter sw = new StreamWriter(cst);

   sw.Write(data);

   sw.Flush();

   cst.FlushFinalBlock();

   sw.Flush();

   return Convert.ToBase64String(ms.GetBuffer(),0,(int)ms.Length);

   

  }


  public static string Decode(string data)

  {   

   byte[] byKey = System.Text.ASCIIEncoding.ASCII.GetBytes(KEY_64);

   byte[] byIV = System.Text.ASCIIEncoding.ASCII.GetBytes(IV_64);


   byte[] byEnc;

   try

   {

    byEnc = Convert.FromBase64String(data);

   }

   catch

   {

    return null;

   }


   DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider();

   MemoryStream ms = new MemoryStream(byEnc);

   CryptoStream cst = new CryptoStream(ms,cryptoProvider.CreateDecryptor(byKey,byIV),CryptoStreamMode.Read);

   StreamReader sr = new StreamReader(cst);

   return sr.ReadToEnd();

  }

 }

}

二.RSA算法



DES算法在加密解密过程中需要一个key,解码时如果key不对是不行的,因此,对于des算法加密的程序来

说,只要key不泄漏,即使在传输过程中有人监听,也不怕资料曝光。但是这同时又产生一个问题,加密解密

双方都需要同一个key,那么这个key又要怎样才能比较安全的由加密方传送到解密方呢?如果同样是通过网络传

送,那么泄漏的可能性也是非常大的。

使用rsa算法,可以解决上述des算法的问题。rsa模式已经得到全世界的支持,它也是把明文转换成密文的

一种块密码,不同之处是它有两个密钥。创建两个协同工作的密钥时rsa的最重要的特性。这种模式的要点在于

,它可以产生一对密钥,一个人可以用这对密钥中的一个加密消息,而令一个人可以用这对密钥解密消息。同

时任何人都无法通过公钥确定私钥,也没有人能使用加密消息的密钥解密。只有密钥对中的另一把可以解密消

息。

rsa算法的整个流程基本上可以看作是这样的:

假设数据要从甲到乙,于是由乙随机产生一个数据来作为key,我们称之为private key(私钥),这个key自

始至终都只留在乙的机器里不送出来。然后,由这个private key计算出另一个key,我们称之为public key。

这个public key的特性是几乎不可能反演算出private key来。之后再将这个public key通过网络传送给甲机器

,而甲机器将数据用这个public key编码,这个编码过的数据一定得使用private key才解的开,然后甲机器将

编码过的数据通过网络传送给乙,乙再用private key将数据解码。

在整个传送过程中,如果有第三者监听数据时,他只能得到乙传给甲的public key,以及甲用这个public

key编码后的数据,而没有private key,监听者是无法解码的。

接下来让我们步入正题,看看rsa的具体算法是怎样实现的。

首先找出三个数:p,q,r,其中p,q是两个相异的质数,r是与(p-1)(q-1)互质的数,p,q,r这三个数便是

private key。接着,找出一个数m,使得rm==1 mod(p-1)(q-1)。这个m一定存在。因为r与(p-1)(q-1)互质,

所以用辗转相除法就可以得到了m这个数。

接下来再计算n=pq。m、n这两个数便是最后的public key。之后便是编码,其过程是这样的:若资料为a,

将看成是一个大整数,假设a 那么要怎样选取质数才合适呢,上面我们提到选择的质数要越大越好,但事实上质数的选取也有着相同的困难。因为就目前而言,根本没有一个所谓的质数产生公式可以用。

解析数论上有一个定理,当p很大时,质数的分布密度与1/log p成正比,也就是说一个质数和下一个质数的差平均而言与log p成正比,还好log p的成长并不会很快,所以就采用一个方法:一个数接着一个数得找,直到找到质数为止!!!!即使n大到2的512次方,所要花的时间也不会大到天文数字,用486的话,大概在数秒钟至十秒之内会找到(包括判定的时间) 你们谁还用486?我想没有人吧!即使有也是极个别的。那又怎么样去判别一个数是不是质数呢?到目前为止,我所知道的还没有一个很有效的方法来判定。当然我们也可以用试除法,但是要用这个方法的话,2的512次方这么大的数,大概要除个大于10的30次方 年的时间。:)显然是除法是不现实的。还有一个方法,可以利用费马小定理来做判定:假设一个数p,如果p是质数,a的p次方= =a mod p,如果p不是质数,那么a的p次方= = a mod p虽然也有可能成立,但成立的机率非常小,而且p越大时几率越小。用这种方法,我们就找一些质数来测定,比如验证2的p次方= =2 mod p,

3的p次方= = 3 mod p, 5的p次方= =5 mod p ……等式是否成立。如此一来,p是质数的几率就变得非常非常高了。

时间: 2024-08-03 12:11:59

加密解密-DES算法和RSA算法的相关文章

最小生成树之Prim算法和Kruskal算法

一个连通图可能有多棵生成树,而最小生成树是一副连通加权无向图中一颗权值最小的生成树,它可以根据Prim算法和Kruskal算法得出,这两个算法分别从点和边的角度来解决. Prim算法 输入:一个加权连通图,其中顶点集合为V,边集合为E: 初始化:Vn = {x},其中x为集合V中的任一节点(起始点),Enew = {}: 重复下列操作,直到Vn = V:(在集合E中选取权值最小的边(u, v),其中u为集合Vn中的元素,而v则是V中没有加入Vn的顶点(如果存在有多条满足前述条件即具有相同权值的边

dijkstra算法-对比/定量研究Dijkstra算法和dial算法的性能

问题描述 对比/定量研究Dijkstra算法和dial算法的性能 对比/定量研究Dijkstra算法和dial算法的性能 具体程序无从入手 求指点

字符串查找算法总结(暴力匹配、KMP 算法、Boyer-Moore 算法和 Sunday 算法)

可进入我的博客查看原文. 字符串匹配是字符串的一种基本操作:给定一个长度为 M 的文本和一个长度为 N 的模式串,在文本中找到一个和该模式相符的子字符串,并返回该字字符串在文本中的位置. KMP 算法,全称是 Knuth-Morris-Pratt 算法,以三个发明者命名,开头的那个K就是著名科学家 Donald Knuth .KMP 算法的关键是求 next 数组.next 数组的长度为模式串的长度.next 数组中每个值代表模式串中当前字符前面的字符串中,有多大长度的相同前缀后缀. Boyer

C++实现查找中位数的O(N)算法和Kmin算法_C 语言

本文实例讲述了C++实现查找中位数的O(N)算法和Kmin算法,分享给大家供大家参考.具体方法如下: 利用快速排序的partition操作来完成O(N)时间内的中位数的查找算法如下: #include <iostream> #include <cassert> #include <algorithm> #include <iterator> using namespace std; int array[] = {1, 2, 10, 8, 9, 7, 5};

C# MD5 加密解密 DES RC2 3DES AES等软创加密类

C# 各种加密方法封装类,软创加密类,内含MD5加密解密.DES法解密加密.RC2加密解密.3DES加密解密,还有AES加解密等,使用时用到哪一种加密方法,可把代码单独摘录出来,本类比较综合,代码中包括注释,完整代码: view sourceprint?001using System; 002using System.Collections.Generic; 003using System.Text; 004using System.IO; 005using System.Security.Cr

单源最短路径算法--Dijkstra算法和Bellman-Ford算法

Dijkstra算法 算法流程: (a) 初始化:用起点v到该顶点w的直接边(弧)初始化最短路径,否则设为∞: (b) 从未求得最短路径的终点中选择路径长度最小的终点u:即求得v到u的最短路径: (c) 修改最短路径:计算u的邻接点的最短路径,若(v,-,u)+(u,w)<(v,-,w),则以(v,-,u,w)代替. (d) 重复(b)-(c),直到求得v到其余所有顶点的最短路径. 特点:总是按照从小到大的顺序求得最短路径. 假设一共有N个节点,出发结点为s,需要一个一维数组prev[N]来记录

python实现的二叉树算法和kmp算法实例_python

主要是:前序遍历.中序遍历.后序遍历.层级遍历.非递归前序遍历.非递归中序遍历.非递归后序遍历 复制代码 代码如下: #!/usr/bin/env python#-*- coding:utf8 -*- class TreeNode(object):    def __init__(self, data=None, left=None, right=None):        self.data = data        self.left = left        self.right =

Swift 使用RSA算法进行数据加密,解密以及数字签名

RSA算法是一种非对称加密算法,要了解RSA算法,首先要知道什么是对称加密算法,什么是非对称加密算法. 1,对称加密算法 密钥只有一个,发收信双方都使用这个密钥对数据进行加密和解密. 特点:算法公开.计算量小.加密速度快.加密效率高特点.但交易双方都使用同样钥匙,安全性得不到保证. 具体算法有:DES算法,3DES算法,TDEA算法,Blowfish算法,RC5算法,IDEA算法. 2,非对称加密算法 非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey).

兼容PHP和Java的des加密解密代码分享_php实例

php代码: <?php class DES { var $key; var $iv; //偏移量 function DES($key, $iv=0) { $this->key = $key; if($iv == 0) { $this->iv = $key; } else { $this->iv = $iv; } } //加密 function encrypt($str) { $size = mcrypt_get_block_size ( MCRYPT_DES, MCRYPT_MO