当前位置: 首页 > 编程日记 > 正文

加密解密-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加密和解密

None.gifusing System;
None.gif
using System.IO;
None.gif
using System.Security.Cryptography;
None.gif
None.gif
namespace Vavic
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif 
/**//// <summary>
InBlock.gif 
///用C#实现Des加密和解密
InBlock.gif 
/// Security 的摘要说明。
ExpandedSubBlockEnd.gif 
/// </summary>

InBlock.gif public class Security
ExpandedSubBlockStart.gifContractedSubBlock.gif 
dot.gif{
InBlock.gif  
const string KEY_64 = "VavicApp";
InBlock.gif  
const string IV_64 = "VavicApp"//注意了,是8个字符,64位
InBlock.gif

InBlock.gif  
public Security()
ExpandedSubBlockStart.gifContractedSubBlock.gif  
dot.gif{
InBlock.gif   
//
InBlock.gif   
// TODO: 在此处添加构造函数逻辑
InBlock.gif   
//
ExpandedSubBlockEnd.gif
  }

InBlock.gif
InBlock.gif  
public static string Encode(string data)
ExpandedSubBlockStart.gifContractedSubBlock.gif  
dot.gif{
InBlock.gif   
byte[] byKey = System.Text.ASCIIEncoding.ASCII.GetBytes(KEY_64);
InBlock.gif   
byte[] byIV = System.Text.ASCIIEncoding.ASCII.GetBytes(IV_64);
InBlock.gif
InBlock.gif   DESCryptoServiceProvider cryptoProvider 
= new DESCryptoServiceProvider();
InBlock.gif   
int i = cryptoProvider.KeySize;
InBlock.gif   MemoryStream ms 
= new MemoryStream();
InBlock.gif   CryptoStream cst 
= new CryptoStream(ms,cryptoProvider.CreateEncryptor(byKey,byIV),CryptoStreamMode.Write);
InBlock.gif   
InBlock.gif   StreamWriter sw 
= new StreamWriter(cst);
InBlock.gif   sw.Write(data);
InBlock.gif   sw.Flush();
InBlock.gif   cst.FlushFinalBlock();
InBlock.gif   sw.Flush();
InBlock.gif   
return Convert.ToBase64String(ms.GetBuffer(),0,(int)ms.Length);
InBlock.gif   
ExpandedSubBlockEnd.gif  }

InBlock.gif
InBlock.gif  
public static string Decode(string data)
ExpandedSubBlockStart.gifContractedSubBlock.gif  
dot.gif{   
InBlock.gif   
byte[] byKey = System.Text.ASCIIEncoding.ASCII.GetBytes(KEY_64);
InBlock.gif   
byte[] byIV = System.Text.ASCIIEncoding.ASCII.GetBytes(IV_64);
InBlock.gif
InBlock.gif   
byte[] byEnc;
InBlock.gif   
try
ExpandedSubBlockStart.gifContractedSubBlock.gif   
dot.gif{
InBlock.gif    byEnc 
= Convert.FromBase64String(data);
ExpandedSubBlockEnd.gif   }

InBlock.gif   
catch
ExpandedSubBlockStart.gifContractedSubBlock.gif   
dot.gif{
InBlock.gif    
return null;
ExpandedSubBlockEnd.gif   }

InBlock.gif
InBlock.gif   DESCryptoServiceProvider cryptoProvider 
= new DESCryptoServiceProvider();
InBlock.gif   MemoryStream ms 
= new MemoryStream(byEnc);
InBlock.gif   CryptoStream cst 
= new CryptoStream(ms,cryptoProvider.CreateDecryptor(byKey,byIV),CryptoStreamMode.Read);
InBlock.gif   StreamReader sr 
= new StreamReader(cst);
InBlock.gif   
return sr.ReadToEnd();
ExpandedSubBlockEnd.gif  }

ExpandedSubBlockEnd.gif }

ExpandedBlockEnd.gif}



二.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是质数的几率就变得非常非常高了。

相关文章:

开始Dojo之路

开始Dojo之路waiting……转载于:https://blog.51cto.com/frabbit2013/1242108

图像相似度计算之直方图方法OpenCV实现

操作步骤&#xff1a; 1. 载入图像(灰度图或者彩色图)&#xff0c;并使其大小一致&#xff1b; 2. 若为彩色图&#xff0c;增进行颜色空间变换&#xff0c;从RGB转换到HSV&#xff0c;若为灰度图则无需变换&#xff1b; 3. 若为灰度图&#xff0c;直接计算其直方…

黄皓之后,计算机科学上帝Don Knuth仅用一页纸证明布尔函数敏感度猜想

作者 | Freesia编辑 | 夕颜出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;导读&#xff1a;近日&#xff0c;美国艾默里大学计算机与数学科学系教授黄皓&#xff08;Hao Huang&#xff09;用一篇短短 6 页的论文证明了布尔函数&#xff0c;引发了计算机和数学领域社…

数位DP 不断学习中。。。。

1&#xff0c; HDU 2089 不要62 :http://acm.hdu.edu.cn/showproblem.php?pid2089 题意&#xff1a;不能出现4&#xff0c;或者相邻的62&#xff0c; dp[i][0],表示不存在不吉利数字 dp[i][1],表示不存在不吉利数字&#xff0c;且最高位为2 dp[i][2],表示存在不吉利数字 #i…

linux 性能 管理 与 优化

一、影响Linux服务器性能的因素操作系统级&#xff1a;CPU、内存、磁盘I/O带宽、网络I/O带宽程序应用级二、系统性能评估影响性能因素 评判标准 好 坏 糟糕 CPU user% sys%< 70% user% sys% 85% user% sys% >90% 内存 Swap In&#xff08;si&…

对称加密算法之DES介绍

DES(Data Encryption Standard)是分组对称密码算法。DES采用了64位的分组长度和56位的密钥长度&#xff0c;它将64位的输入经过一系列变换得到64位的输出。解密则使用了相同的步骤和相同的密钥。DES的密钥长度为64位&#xff0c;由于第n*8(n1,2,…8)是校验位&#xff0c;因此实…

200行代码解读TDEngine背后的定时器

作者 | beyondma来源 | CSDN博客导读&#xff1a;最近几周&#xff0c;本文作者几篇有关陶建辉老师最新的创业项目-TdEngine代码解读文章出人意料地引起了巨大的反响&#xff0c;原以为C语言已经是昨日黄花&#xff0c;不过从读者的留言来看&#xff0c;C语言还是老当益壮&…

fastJson结合Nutz.Mapl的进阶应用

为什么80%的码农都做不了架构师&#xff1f;>>> 今天要做一堆数据的序列化, 反序列化, 序列化没问题, 反序列化却遇到了点小意外, 这一堆数据不是一个类!!!!!!当然可以通过类内部的一个类型对象来判断, 但是fastJson并没有这个功能, 只能自己一个一个的遍历一个一个…

OpenCV实现遍历文件夹下所有文件

OpenCV中有实现遍历文件夹下所有文件的类Directory&#xff0c;它里面包括3个成员函数&#xff1a;(1)、GetListFiles&#xff1a;遍历指定文件夹下的所有文件&#xff0c;不包括指定文件夹内的文件夹&#xff1b;(2)、GetListFolders&#xff1a;遍历指定文件夹下的所有文件夹…

阿里、京东、快手、华为......他们是如何构建一个个推荐系统“帝国”的?

推荐系统在人们的日常生活中随处可见&#xff0c;成为我们生命中不可或缺的一部分。作为当今应用最为广泛和成熟的 AI 技术之一&#xff0c;它是信息生产者、传播者与用户之间的桥梁&#xff0c;可以让信息最精准、最高效地到达需求不一的用户面前。每天打开手机或电脑端的大部…

前端基础_ES6

声明 三大关键字声明变量&#xff1a;var &#xff08;ES5语法&#xff09; let &#xff08;ES6语法&#xff09;声明常量&#xff1a;const (ES6语法) var 声明变量特性1、支持 函数作用域2、支持 JS预解析 &#xff08;所谓变量提升&#xff09;3、支持 重复声明 &#xff…

5大典型模型测试单机训练速度超对标框架,飞桨如何做到?

导读&#xff1a;飞桨&#xff08;PaddlePaddle&#xff09;致力于让深度学习技术的创新与应用更简单。在单机训练速度方面&#xff0c;通过高并行、低开销的异步执行策略和高效率的核心算子&#xff0c;优化静态图训练性能&#xff0c;在Paddle Fluid v1.5.0的基准测试中&…

windowsXP用户被禁用导致不能网站登录

1、查看系统事件&#xff0c;发现弹出如下的错误 2、根据上面的错误&#xff0c;我们很容易就可以判断是禁用了账户引起的 2.1后面进入计算机管理&#xff0c;再进入用户管理 2.2双击点开Internet来宾用于&#xff0c;发现此用户已经停用了。 2.3双击点开与IIS访问有关用户&…

从头到尾使用Geth的说明-3-geth参数说明和环境配置

1.参数说明 ETHEREUM选项:--config value TOML 配置文件--datadir "/home/user4/.ethereum" 数据库和keystore密钥的数据目录--keystore keystore存放目录(默认在datadir内)--nousb …

OpenSSL中对称加密算法DES常用函数使用举例

主要包括3个文件&#xff1a; 1. cryptotest.h:#ifndef _CRYPTOTEST_H_ #define _CRYPTOTEST_H_#include <string>using namespace std;typedef enum {GENERAL 0,ECB,CBC,CFB,OFB,TRIPLE_ECB,TRIPLE_CBC }CRYPTO_MODE;string DES_Encrypt(const string cleartext, const…

从原理到落地,七大维度读懂协同过滤推荐算法

作者丨gongyouliu来源 | 大数据与人工智能导语&#xff1a;本文会从协同过滤思想简介、协同过滤算法原理介绍、离线协同过滤算法的工程实现、近实时协同过滤算法的工程实现、协同过滤算法应用场景、协同过滤算法的优缺点、协同过滤算法落地需要关注的几个问题等7个方面来讲述。…

sql查询语句优化需要注意的几点

为了获得稳定的执行性能&#xff0c;SQL语句越简单越好。对复杂的SQL语句&#xff0c;要设法对之进行简化。 常见的简化规则如下&#xff1a; 1&#xff09;不要有超过5个以上的表连接&#xff08;JOIN&#xff09; 2&#xff09;考虑使用临时表或表变量存放中间结果。 3&#…

决策树算法原理(ID3,C4.5)

决策树算法原理(CART分类树) CART回归树 决策树的剪枝 决策树可以作为分类算法&#xff0c;也可以作为回归算法&#xff0c;同时特别适合集成学习比如随机森林。 1. 决策树ID3算法的信息论基础 1970年昆兰找到了用信息论中的熵来度量决策树的决策选择过程&#xff0c;昆兰把这…

对称加密算法之RC4介绍及OpenSSL中RC4常用函数使用举例

RC4是一种对称密码算法&#xff0c;它属于对称密码算法中的序列密码(streamcipher,也称为流密码)&#xff0c;它是可变密钥长度&#xff0c;面向字节操作的流密码。 RC4是流密码streamcipher中的一种&#xff0c;为序列密码。RC4加密算法是Ron Rivest在1987年设计出的密钥长度…

SpringMVC中实现的token,防表单重复提交

一&#xff1a;首先创建一个token处理类 &#xff0c;这里的类名叫 TokenHandlerprivate static Logger logger Logger.getLogger(TokenHandler.class);static Map<String, String> springmvc_token new HashMap<String, String>();//生成一个唯一值的tokenSupp…

利用CxImage实现编解码Gif图像代码举例

Gif(Graphics Interchange Format&#xff0c;图形交换格式)是由CompuServe公司在1987年开发的图像文件格式&#xff0c;分为87a和89a两种版本。Gif是基于LZW算法的无损压缩算法。Gif图像是基于颜色表的&#xff0c;最多只支持8位(256色)。Gif减少了图像调色板中的色彩数量&…

SpringBoot b2b2c 多用户商城系统 ssm b2b2c

来源&#xff1a; SpringBoot b2b2c 多用户商城系统 ssm b2b2c用java实施的电子商务平台太少了&#xff0c;使用spring cloud技术构建的b2b2c电子商务平台更少&#xff0c;大型企业分布式互联网电子商务平台&#xff0c;推出PC微信APP云服务的云商平台系统&#xff0c;其中包括…

AI“生死”落地:谁有资格入选AI Top 30+案例?

2019 年&#xff0c;人工智能应用落地的重要性正在逐步得到验证&#xff0c;这是关乎企业生死攸关的一环。科技巨头、AI 独角兽还有起于草莽的创业公司在各领域进行着一场多方角斗。进行平台布局的科技巨头们&#xff0c;正在加快承载企业部署 AI 应用的步伐&#xff0c;曾经无…

liunx 下su 和sudo 的区别

一. 使用 su 命令临时切换用户身份1、su 的适用条件和威力su命令就是切换用户的工具&#xff0c;怎么理解呢&#xff1f;比如我们以普通用户beinan登录的&#xff0c;但要添加用户任务&#xff0c;执行useradd &#xff0c;beinan用户没有这个权限&#xff0c;而这个权限恰恰由…

非对称加密算法之RSA介绍及OpenSSL中RSA常用函数使用举例

RSA算法&#xff0c;在1977年由Ron Rivest、Adi Shamirh和LenAdleman&#xff0c;在美国的麻省理工学院开发完成。这个算法的名字&#xff0c;来源于三位开发者的名字。RSA已经成为公钥数据加密标准。 RSA属于公开密钥密码体制。公开密钥体制就是产生两把密钥&#xff0c;一把…

依图科技CEO朱珑:“智能密度”对AI发展意味着什么?

8月9日&#xff0c;由中央网信办、工业和信息化部、公安部联合指导&#xff0c;厦门市政府主办的“中国人工智能峰会”于厦门召开。中国工程院院士、北京大学教授高文&#xff0c;依图科技创始人兼CEO朱珑博士等出席峰会并发表了主题演讲。当前&#xff0c;人工智能正在扮演越来…

Office 2016使用NTKO OFFICE控件提示“文件存取错误”的解决办法

2019独角兽企业重金招聘Python工程师标准>>> 之前使用NTKO&#xff0c;电脑安装的说OFFICE2007,但是前2天电脑固态硬盘坏了 &#xff0c;重新安装了系统&#xff0c;安装的说win10和office2016&#xff0c;再访问网站使用ntko时&#xff0c;却提示“文件存取错误”&…

如何制作一个类似Tiny Wings的游戏 Cocos2d-x 2.1.4

在第一篇《如何使用CCRenderTexture创建动态纹理》基础上&#xff0c;增加创建动态山丘&#xff0c;原文《How To Create A Game Like Tiny Wings with Cocos2D 2.X Part 1》&#xff0c;在这里继续以Cocos2d-x进行实现。有关源码、资源等在文章下面给出了地址。 步骤如下&…

腾讯优图开源业界首个3D医疗影像大数据预训练模型

整理 | Jane出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;近日&#xff0c;腾讯优图首个医疗AI深度学习预训练模型 MedicalNet 正式对外开源。这也是全球第一个提供多种 3D 医疗影像专用预训练模型的项目&#xff0c;将为全球医疗AI发展提供基础。许多研…

接口冲突的一种解决方法

问题描述&#xff1a;在一个大的项目中往往会包括很多模块&#xff0c;会有不同的部门或公司来负责实现某个模块&#xff0c;也有可能有第三方或客户的参与。假如他们都用到了某个开源软件&#xff0c;底层模块根据自身的需求对这个开源软件进行了修改或裁减。上层也用到了此开…