精华内容
参与话题
问答
  • 数据加密技术

    千次阅读 2006-12-12 14:38:00
    数据加密是实现网络安全的关键技术之一,本文首先介绍加密的基本概念,然后着重讨论两类最常见的加密技术:私用密钥加密和公开密钥加密,并详细探讨了它们的特点、发展及今后的研究方向。 加密算法; 由于Internet的...
    数据加密是实现网络安全的关键技术之一,本文首先介绍加密的基本概念,然后着重讨论两类最常见的加密技术:私用密钥加密和公开密钥加密,并详细探讨了它们的特点、发展及今后的研究方向。 
    加密算法;
     由于Internet的快速发展,网络安全问题日益受到人们的重视。面临计算机网络存在的潜在威胁与攻击,一个计算机网络安全管理者要为自己所管辖的网络建造起强大、安全的保护手段,可以通过以下六个安全层次完成:即修补和阻止网络漏洞,加密,认证,防火墙,安全协议和法律事务。
     数据加密技术是网络中最基本的安全技术,主要是通过对网络中传输的信息进行数据加密来保障其安全性,这是一种主动安全防御策略,用很小的代价即可为信息提供相当大的安全保护。
    一、加密的基本概念
    "加密",是一种限制对网络上传输数据的访问权的技术。原始数据(也称为明文,plaintext)被加密设备(硬件或软件)和密钥加密而产生的经过编码的数据称为密文(ciphertext)。将密文还原为原始明文的过程称为解密,它是加密的反向处理,但解密者必须利用相同类型的加密设备和密钥对密文进行解密。
    加密的基本功能包括:
    1. 防止不速之客查看机密的数据文件;
    2. 防止机密数据被泄露或篡改;
    3. 防止特权用户(如系统管理员)查看私人数据文件;
    4. 使入侵者不能轻易地查找一个系统的文件。
     数据加密是确保计算机网络安全的一种重要机制,虽然由于成本、技术和管理上的复杂性等原因,目前尚未在网络中普及,但数据加密的确是实现分布式系统和网络环境下数据安全的重要手段之一。
     数据加密可在网络OSI七层协议的多层上实现、所以从加密技术应用的逻辑位置看,有三种方式:
     ①链路加密:通常把网络层以下的加密叫链路加密,主要用于保护通信节点间传输的数据,加解密由置于线路上的密码设备实现。根据传递的数据的同步方式又可分为同步通信加密和异步通信加密两种,同步通信加密又包含字节同步通信加密和位同步通信加密。
     ②节点加密:是对链路加密的改进。在协议传输层上进行加密,主要是对源节点和目标节点之间传输数据进行加密保护,与链路加密类似.只是加密算法要结合在依附于节点的加密模件中,克服了链路加密在节点处易遭非法存取的缺点。
     ③端对端加密:网络层以上的加密称为端对端加密。是面向网络层主体。对应用层的数据信息进行加密,易于用软件实现,且成本低,但密钥管理问题困难,主要适合大型网络系统中信息在多个发方和收方之间传输的情况。
    二、加密技术及其相关问题
    1.加密的分类 
       加密类型可以简单地分为三种:
    1. 根本不考虑解密问题;
    2. 私用密钥加密技术;
    3. 公开密钥加密技术。
     第一种加密技术主要是针对一些像口令加密这样的类型,它只需要被加密,并与以前的加密进行比较;第二种和第三种加密技术是按如何使用密钥上的不同来划分的。以下主要介绍第二种和第三种加密技术。
      (1)私用密钥加密技术
     私用密钥加密利用一个密钥对数据进行加密,对方接收到数据后,需要用同一密钥来进行解密。这种加密技术的特点是数学运算量小,加密速度快,其主要弱点在于密钥管理困难,而且一旦密钥泄露则直接影响到信息的安全性。
     美国数据加密标准及其改进算法
     对称密钥加密技术中最具有代表性的算法是IBM公司提出的DES(Data Encryptiorn Standard)算法,该算法于1977年被美国国家标准局NBS颁布为商用数据加密标准。DES综合运用了置换、代替、代数多种密码技术,把消息分成64位大小的块,使用56位密钥,迭代轮数为l6轮的加密算法。它设计精巧,实现容易,使用方便。"
     DES正式公布后,世界各国的许多公司都推出自己实现DES的软硬件产品。美国NBS至少已认可了30多种硬件和固件实现产品。硬件产品既有单片式的,也有单板式的;软件产品既有用于大中型机的,也有用于小型机和微型机的。.
     三重DES(Triple DES)则是DES的加强版。是一种比较新的加密算法,它能够使用多个密钥,主要是对信息逐次作三次加密。
     随机化数据加密标准(RDES)算法是日本密码学家Nakao Y.Kaneko T等人于1996年初提出的一种新的DES改进算法。它只是在每轮迭代前的右半部增加了一个随机置换,其他均与DES相同,目前看来它比DES安全性要好。
    * 美国新数据加密标准CLIPPER和CAPSTONEF,
     l984年,美国总统里根签署154号国家安全决策会(NSDDl45)命令,国家保密局NSA着手制定美国政府非机要机构使用新的加密标准。NSA推行的商业安全通信签署计划CCEP完全改变了其密码政策,密码的算法不再公开,对用户只提供加密芯片及其硬件设备。NSA所推出加密芯片命名为CLIPPER,其加密算法命名为SKIPJACK,属于64位分组编码的对称密钥体制。
      CLIPPER主要是用于商用计算机网和通信网中对数据和语言进行加密,它被设计成允许法律监听的保密通信方式。在使用前需在一种称为SCIF的安全设备中进行编程,加解密时需将CLIPPER芯片装入加密设备中进行。
     l993年4月,美国白宫推出了EES(EscrowedEncryption Standard)加密标准,作为解决美国国家安全与美国公民需求之间的平衡问题。欲用EES来进行通信的双方都必须拥有带Clipper芯片的电信安全设备。
     美国NSA在推出CLIPPER的同时,还推出了军事通信网中进行数据加密的密码芯片CAPSTONE,并着手对CAPSTONE进行改进,以作为继CLIPPER之后的下一代的数据加密标准。CAPSTONE是在CLIPPER的基础上加入了数字签名算法,密钥交换及相关的数学函数。+
    * 新一代加密算法IDEA
     IDEA(International Data Encryption Algorithm)是一种国际信息加密算法。它是1991年的瑞士ETH Zurich由James Massey 和Xueiia Lai发明的),于l992年正式公开,是一个分组大小为64位,密钥为l28位,迭代轮数为八轮的迭代型密码体制。密钥主要是通过二元和,模216加及216+l乘三种运算来完成,IDEA另一特点是用户可以根据需求选用64位或128位密钥以满足所需的安全要求。
       (2)公开密钥加密技术:
     l976年,Diffie和Hellman首次提出公开密钥加密体制,即每个人都有一对密钥,其中一个为公开的,一个为私有的。发送信息时用对方的公开密钥加密,收信者用自己的私用密钥进行解密。公开密钥加密算法的核心是运用一种特殊的数学函数一单向陷门函数,即从一个方向求值是容易的。但其逆向计算却很困难,从而在实际上成为不可行的。公开密钥加密技术它不仅保证了安全性又易于管理。其不足是加密和解密的时间长。
      公开密钥算法有很多,一些算法如著名的背包算法和McELiece算法都被破译,目前公认比较安全的公开密钥算法主要就是RSA算法及其变种Rabin算法,离散对数算法等。
     RSA是Rivet,Shamir和Adleman于1978年在美国麻省理工学院研制出来的,它是一种比较典型的公开密钥加密算法,其安全性是建立在"大数分解和素性检测"这一已知的著名数论难题的基础上,即:将两个大素数相乘在计算上很容易实现,但将该乘积分解为两个大素数因子的计算量是相当巨大的,以至于在实际计算中是不能实现的。RSA被应用于保护电子邮件安全的Privacy Enhanced Mail(PEM)和Pretty Good Privacy(PGP)。
      我国学者陶仁骥。陈世华提出一种基于有限自动机的公开密钥加密方法:FAPKC0,FAPKC1,FAPKC2,FAPKC3。这是国际上的第一个时序公开密钥算法,其安全性是建立在非线性有限自动机求逆的困难上的。因为从数学上,线性有限自动机已有完美的可逆性理论,但迄今为止未解决非线性有限自动机可逆性理论,它可用于保密通信、数字签名,易于实现,密钥量适中,加解密速度快,已受到国际上的关注。此种密码体制的深人研究方向有:
     ①用大规模集成电路技术实现有限自动机公开密钥密码体制;
     ②对有限自动机公开密钥密码体制的安全做类似于针对RSA或流密码那样的充分分析。
      公开密钥加密技术在密钥管理上的优势使它越来越受到人们的重视,应用也日益广泛。
    2.加密技术发展趋势|
     ①私用密钥加密技术与公开密钥加密技术相结合:鉴于两种密码体制加密的特点,在实际应用中可以采用折衷方案,即结合使用DES/IDEA和RSA,以DES为"内核",RSA为"外壳",对于网络中传输的数据可用DES或IDEA加密,而加密用的密钥则用RSA加密传送,此种方法既保证了数据安全又提高了加密和解密的速度,这也是目前加密技术发展的新方向之一。
     ②寻求新算法:跳出以常见的迭代为基础的构造思路,脱离基于某些数学问题复杂性的构造方法。如刘尊全先生提出的刘氏算法,是一种基于密钥的公开密钥体制,它采用了随机性原理构造加解密变换,并将其全部运算控制隐匿于密钥中,密钥长度可变。它是采用选取一定长度的分割来构造大的搜索空间,从而实现一次非线性变换。此种加密算法加密强度高、速度快、计算开销低。
     ③加密最终将被集成到系统和网络中,例如IPV6协议就已有了内置加密的支持,在硬件方面,Intel公司正研制一种加密协处理器。它可以集成到微机的主极上。
    3.密钥管理t
     对于私用密钥加密和公开密钥加密系统来讲、并不强调对加密/解密算法的保密。计算机网络加密的安全性主要是依赖于算法本身的安全性和对密钥的保护。密钥主要有会话密钥(Session Key)、基本密钥(Basic Key)和主密钥(Master Key)三种。会话密钥是通信双方在会话中使用的密钥,此种密钥只在一次会话中有效,会话结束时密钥就失效;在网络中用来传送会话密钥的密钥,就是基本密钥;而对基本密钥进行加密的密钥则称为主密钥。网络中一般是采用这种三级密钥方案来进行保密通信的。<
     从技术上看,密钥管理包括密钥的产生、存储、分配、使用和销毁等一系列技术问题,密钥分配是其中最重要的问题。从根本上讲,主要存在两种网络密钥管理:KDC(Key Distribution Center)和Diffie-Hellman方法。KDC使用可信第三方来验证通信双方的真实性,产生会话密钥,并通过数字签名等手段分自己密钥。Diffie-Hellmarl方法则不需KDC,通信发起方产生通信会话的私用密钥,并通过数字签名或零知识证明等方式安全传递通信密钥。IETF现在正在开发一种基于Diffi-Hellman技术的密钥交换协议Okaley,从而具有更好的安全性和强立性。目前多密钥分配是有待深入研究的领域。KotC
     随着网络的应用与发展,网络安全问题日益突出。数据加密是确保计算机网络安全的一种重要的机制,虽然由于成本、技术和管理上的复杂性,目前尚未在网络中普及,但数据加密作为实现网络环境下数据安全的重要手段之一,必将得到广泛应用,设计优秀的现代加密技术还融入了防篡改和防否认等数字签名技术,故其不但适用于企业,而且也适用于其他用户。s
    数据加密技术
      现代社会对信息安全的需求大部分可以通过密码技术来实现。密码技术是信息安全技术中的核心技术,它主要由密码编码技术和密码分析技术两个分支组成。密码编码技术的主要任务是寻求产生安全性高的有效密码算法。以满足对消息进行加密或认证的要求。密码分析技术的主要任务是彼译密码或伪造认证码,实现窃取机密信息或进行诈骗破坏活动。这两个分支既相互对立,又相互依存。信息的安全性主要包括两个方面即信息的保密性和信息的认证性。保密的目的是防止对手破译系统中的机密信息,认证的目的是验证信息的发送者是真正的,而不是冒充的。验证信息的完整性,即验证信息在传送或存储过程中未被窜改、重放或延迟等。信息的保密性和信息的认证性是信息安全性的两个不同方面,认证不能自动地提供保密性,而保密也不能自然地提供认证功能。在用密码技术保护的现代信息系统的安全性主要取决于对密钥的保护,而不是依赖于对算法或硬件本身的保护,即密码算法的安全性完全寓于密钥之中。可见,密钥的保护和管理在数据系统安全中是极为重要的。人们目前特别关注的是密钥托管技术。
    一、信息保密技术
     信息的保密性是信息安全性的一个重要方面。保密的目的是防止对手破译信息系统中的机密信息。加密是实现信息保密性的一种重要手段,就是使用数学方法来重新组织数据,使得除了合法的接收者外,任何其他人要想恢复原先的"消息"(将原先的消息称作"明文")或读懂变化后的"消息"(将变化后的消息称作"密文")是非常困难的,将密文变换成明文的过程称作解密。可见,加密技术可使一些重要数据存储在一台不安全的计算机上,或可以在一个不安全的信道上传送,只有持有合法密钥的一方才能获得"明文"。所谓加密算法就是对明文进行加密时所采用的一组规则,解密算法就是对密文进行解密时所采用的一组规则。加密算法和解密算法的操作通常都是在一组密钥控制下进行的,分别称为加密密钥和解密密钥。根据加密密钥和解密密钥是否相同,可将现有的加密体制分为两种:一种是私钥或对称加密体制、这种体制的加密密钥和解密密钥相同,其典型代表是美国的数据加密标准(D E S):另一种是公钥或非对称加密体制,这种体制的加密密钥和解密密钥不相同并且从其中一个很难推出另一个。加密密钥可以公开,而解密密钥可由用户自己秘密保存,其典型代表是R S A体制。
     根据明文加密方式的不同,又可将私钥加密体制分为两类:一类是流密码,在这类体制中,明文按字符逐位地被加密;另一类是分组密码,在这类体制中,先将明文分组(每组含有多个字符),然后逐组地进行加密。
     从社会应用密码的需求来看,目前国际上最关心的加密技术有两种:一种是分组密码。另一种是公钥密码。
    1.  分组密码技术
     DES是日前研究最深入、应用最广泛的一种分组密码。己有长达20年的历史。DES的研究大大丰富了设计和分析分组密码的理论、技术和方法。针对DES,人们研制了各种各样的分析分组密码的方法,比如差分分析方法和线性分析方法,这些方法对DES的安全性有一定的威胁,但没有真正对16轮D E S的安全性构成威胁。自从DES公布之日起,人们就认为DES的密钥长度太短(只有56比特),不能抵抗最基本的攻击方法--穷搜索攻击。
     目前,国际上公开的分组密码算法有100多种,比如,Lucifer、IDEA、SAFER,k-64、RC5、Skipjack、RC2、FEAL一N、REDOC一II、L0KI、CAST、Khuf u、Khafre、MMB、3一WAY、TEA、MacGuffin、SHARK、BEAR、LION、CA.1.1、CRAB、Biowfish、G0 ST、SQUARE和MISTY等。对这些算法感兴趣的读者可在Schneier所著的《Applied Cry ptography:Protocals,Algorithms,and Source CodeinC》一书和会议论文集《FastSoftware Encryption》中找到它们的详细讨论,也可以通过Internet查询到。美国目前正在制定和评估新的数据加密标准,替代1998年到期的DES。}
    2.  公钥加密技术
     私钥密码体制的缺陷之一是通信双方在进行通信之前需通过一个安全信道事先交换密钥。这在实际应用中通常是非常困难的。而公钥密码体制可使通信双方无须事先交换密钥就可建立起保密通信。公钥算法要比私钥算法慢得多。在实际通信中,一般利用公钥密码体制来保护和分配(交换)密钥,而利用私钥密码体制加密消息。公钥密码体制主要用于认证(比如数字签名,身份识别等)和密钥管理等。公钥密码体制的出现为解决私钥密码体制的密钥分配开辟了一条广阔的道路。c
     值得一提的是,在有些文献中,公钥密码体制的含义很广,不仅包括公钥加密体制,而且还包括各种公钥协议比如数字签名、身份识别协议、密钥交换协议等,但我们这里所说的公钥密码体制,除了特别声明外,特指公钥加密体制。TOUrH
     目前国际上已经有许多种公钥密码体制,但比较流行的和被人们认可的公钥密码主要有两类,一类是基于大整数因子分解问题的,其中最典用的代表是RSA公钥密码体制:另--类是基于离散对数问题的,比如E lGamal公钥密码体制和椭圆曲线公钥密码体制。由于分解大整数的能力日益增强,所以对RSA公钥密码的安全带来了一定的威胁,512比特模长的RSA体制已经不安全。人们建议使用l024比特模长,要保证20年的安全就要选择1280比特模长,增大模长带来了实现上的难度。而基于离散对数问题的公钥密码在目前技术下有512比特模长;就能够保证其安全性。特别是椭圆曲线上的离散对数的计算要比有限域上的离散对数的计算更困难,能设计出密钥更短的公钥密码体制,因而受到了国际上广泛的关注,RSA等一些公司已经开发出了符合IEEEP l363标准的椭圆曲线公钥密码。
     RSA算法的安全性是基于分解大整数的困难性。在RSA体制中使用了这样一条基本事实:一般地说,分解两个大素数之积是一利很困难的事情。
     下面是A使用一个公钥密码体制发送信息给B的过程:
     (1)A首先获得B的公钥。
     (2)A用B的公钥加密信息,然后发送给B。
     (3)B用自己的私钥解密A发送的信息。
     已经制造出了许多不同的RSA加密芯片。RSA算法在美国已申请了专利,将于2000年9月20日到期。破译RSA的一个直接的方法是分解n,目前的分解能力大概为130位十进制数,但512比特(l54位十进制数)模长的RSA体制安全性已经受到一定的威胁,人们建议使时l024比特(308位十进制数)模长。关于RSA体制,也有一些别的分析方法,比如选择密文攻击、同模攻击和低指数攻击等。这些攻击告诫人们在选择RSA体制的参数和使用RSA体制时必须遵循一定的规则。tTKh
     除了RSA外,还有一些别的公钥加密算法,比如E lGamal算法、Rabin算法、McEliece算法、Merkie一Hellman背包算法、Chor一Rivest背包算法、有限自动机公钥算法、椭圆曲线的密码算法、细胞自动机公钥密码算法、LU公钥密码算法、多重密钥的公钥密码算法和概率加密算法等。
    二、信息认证技术
     信息的认证性是信息安全性的另一个重要方面。认证的目的有两个:一是验证信息的发送者是真正的,而不是冒充的:二是验证信息的完整性.即验证信息在传送或存储过料中是否被窜改,重放或延迟等。
     对密码系统的攻击主要有两类:一类是被动攻击,对手只是对截获的密文进行分析:另一类是主动攻击,对于通过采用删除、增添、重放和伪造等手段主动向系统注入假消息。认证是防止他人对系统进行主动攻击(如伪造,窜改信息等)的一种重要技术。
    1. 数字签名技术
     政治、军事、外交等活动中签署文件,商业上签定契约和合同以及日常生活中在书信、从银行取款等事务中的签字,传统上都采用手写签名或印鉴。签名起到认证、核准和生效作用。随着信息时代的来临,人们希望通过数字通信网络进行远距离的贸易合同的签名,数字签名应运而生,并开始时了商业通信系统,如电子邮递、电子转帐、办公室自动化等系统中。
     一个数字签名算法主要由两个算法组成,即签名算法和验证算法。签名者能使用一个(秘密)签名算法签一个消息,所得的签名能通过一个公开的验证算法来验证。给定一个签名,验证算法根据签名是否真实来作出一个"真"或"假"的问答。
     目前已有大量的数字签名算法,如RSA数字签名算法、EIGamal数字签名算法、Fiat一Shamir数字签名算法、Guillou一Quisquarter数字签名算法、Schnorr数字签名算法、0ng一Schnorr一Shamir数字签名算法、美国的数字签名标准/算法(D S S/D S A)、椭圆曲线数字签名算法和有限自动机数字签名算法等。
     A使一个签名算法对消息x签名和B验证签名(x,y)的过程可描述为: 
    (l)A首先使用他的秘密密钥对x进行签名得y。
    (2)A然后将(x,y)发送给B。
    (3)最后B用A的公钥验证A的签名的合法性
      DSA是美国国家标准技术学会(NIST)的一个标准,它是ElGamal数字签名算法的一个修改。当选择p为512比特的素数时,ElGamal数字签名的尺寸是1024比特,而在DSA中通过选择一个160比特的素数可将签名的尺寸降低为320比特,这就大大地减少了存储空间和传输带宽。关于DSA也有一些批评意见,但它已被人们广泛地接受和应用,它的确为数字签名技术的应用提供了一个适当的内核。
    2. 身份识别技术
     通信和数据系统的安全性常常取决于能否正确识别通信用户或终端的个人身份。比如银行的自动取款机(ATM)可将现款发放给经它正确识别的帐号持卡人。对计算机的访问和使用、安全地区的出入和放行、出入境等都是以准确的身份识别为基础的。身份识别技术能使识别者让对方识别到自己的真正身份,确保识别者的合法权益。但是从更深一层意义上来说,它是社会责任制的体现和社会管理的需要。
     进入电子信息社会,虽然有不少学者试图使用电子化生物唯一识别信息(如指纹、掌纹、声纹、视网膜、脸形等),但由于代价高、准确性低、存储空间人和传输效率低,不适合计算机读取和判别,只能作为辅助措施应用。而使用密码技术,特别是公钥密码技术,能够设计出安全性高的识别协议,受到人们的青睐。
     身份识别的常用方式主要有两种,一种是使用通行字的方式;另一种是使用持证的方式。通行字是使时最广泛的一种身份识别方式,比如中国古代调兵用的虎符和现代通信网的拔入协议等。通行字一般由数字、字母、特殊字符、控制字符等组成的长为5--8的字符串。其选择规则为:易记,难于被别人猜中或发现,抗分析能力强,还需要考虑它的选择方法、使用期、长度、分配、存储和管理等。通行字方式识别的办法是:识别者A先输入他的通行字,然后计算机确认它的正确性。A和计算机都知道这个秘密通行字,A每次登录时,计算机都要求A输入通行字。这样就要求计算机存储通行字,一旦通行字文件暴露,就可获得通行字。为了克服这种缺陷,人们建议采用单向函数。此时,计算机存储通行字的单项函数值而不是存储通行字。其认证过程为:
     1.A将他的通行字传送给计算机。
     2.计算机完成通行字的单向函数值的计算。
     3.计算机把单向函数值和机器存储的值比较。
     由了计算机不再存储每个人的有效通行字表,某些人侵入计算机也无法从通行字的单向函数值表中获得通行字。当然,这种保护也抵抗不住某些攻击。不过,它的确是一种简单而有效的识别方法。
     持证(token)是一种个人持有物,它的作用类似于钥匙,用于启动电子设备。使用比较多的是一种嵌有磁条的塑料卡,磁条上记录有用于机器识别的个人信息。这类卡通常和个人识别号(PIN) 一起使用。这类卡易于制造,而且磁条上记录的数据也易于转录,因此要设法防止仿制。为了提高磁卡的安全性,人们建议使用一种被称作"智能卡"的磁卡来代替普通的磁卡,智能卡与普通的磁卡的主要区别在于智能卡带有智能化的微处理器和存储器。智能卡已成为目前身份识别的一种更有效、更安全的方法。智能卡仅仅为身份识别提供了一个硬件基础,要想得到安全的识别,还需要与安全协议配套使用。
     
     从实用角度来讲,人们最关心的是设计简单而且能在一个智能卡上实现的安全识别协议。一个安全的身份识别协议至少应满足以下两个条件:
     
    1.识别者A能向验证者B证明他的确是A。
    2.在识别者A向验证者B证明他的身份后,验证者B没有获得任何有用的信息,B不能模仿A向第三方证明他是A。
     目前已经设计出了许多满足这两个条件的识别协议。比如Schnorr身份识别协议、Okanmto身份识别协议、Guillou-Quisquater身份识别协议和基于身份的识别协议等.这些识别协议均为询问-应答式协议。询问-应答式协议的基本观点是:验证者提出问题(通常是随机选择一些随机数,称作口令),由识别者回答,然后验证者验证其真实性。另一类比较重要的识别协议是零知识身份识别协议。零知识的基本思想是:称为证明者的一方试图使被称为验证者的另一方相信某个论断是正确的,却又不向验证者提供任何有用的信息。Feige、Fiat和Shamir基于零知识的思想设计了第一个零知识身份识别协议,称为Feige-Fiat-Shamir零知识身份识别协议。
    3. 杂凑技术和消息的完整性
     杂凑函数(也称杂凑算法)就是把任意长的输入串变化成固定长的输出串的一种函数。因为杂凑函数是多对一的函数,所以一定将某些不同的输入变化成相同的输入。这就要求给定一个杂凑值,求其逆是比较难的,但给定的输入计算杂凑值必须是很容易的。
     一个安全的杂凑函数应该至少满足以下几个条件:
    1. 输入长度是任意的
    2. 输出长度是固定的,根据目前的计算技术应至少取128比特长,以便抵抗生日攻击。
    3. 对每一个给定的输入,计算输出其杂凑值是很容易的。
    4. 给定杂凑函数的描述,找到两个不同的输入消息杂凑到同一个值在计算上是不可行的,或给定杂凑函数的描述和一个随机选择的消息,找到另一个与该消息不同的消息使得它们杂凑到同一个值在计算上也是不可行的。
     攻击杂凑函数的典型方法是生日攻击,生日攻击的基本观点来自于生日问题:在一个教室里最少有多少学生时,可使得在这个教室里至少有两个学生的生日在同一天的概率不小于50%?这个问题的答案是23。
     目前已研制出适合于各种用途的杂凑算法,这些算法都是伪随机函数,任何杂凑值都是等可能的。输出并不以可辨别的方式依赖于输入。任何输入串中单个比特的变化,将会导致输出比特串中大约一般的比特发生变化。利用某些数学难题比如因子分解问题和离散对数问题等设计的杂凑函数有Davies-Price平方杂凑算法、CCITT建议、Juene man杂凑算法、Damgard平方杂凑算法、Damgard背包杂凑算法、Schnorr的FFT杂凑算法等。这些算法中有的已不安全,而有的仍然是安全的。利用某些私钥密码体制比如DES等设计的杂凑函数有Rabin杂凑算法、Winternitz杂凑算法、Quisquater-Girault杂凑算法、Merkle杂凑算法、N-Hash算法等,这种杂凑函数的安全性与所使用的基础密码算法有关。不基于任何假设和密码体制直接设计杂凑函数是当今比较流行的一种设计方法。美国的安全杂凑算法(SHA)就是这类算法,另外还有MD4、MD5、MD2、RIPE-MD、HAVAL等算法。
     美国国家标准与技术局和美国国家安全局共同设计了一个与美国数字签名算法(DSA)一起使用的安全杂凑算法(SHA),标准是安全杂凑标准(SHS),SHA是用于该标准的算法。SHA的设计原则与MD4算法的设计原则极其相似,它很象是MD4算法的一种变形,但SHA的设计者没有公开SHA的详细设计决策。SHA输入的长度限制在2比特之内,输出长度为160比特。
     消息认证是指使意定的接收者能够检验收到的消息是否真实的方法。检验的内容包括:证实消息的源和宿、消息的内容是否被窜改过(即消息的完整性)、消息的序号和时间性。可见,消息认证可使接收者识别消息的源和内容的真伪、时间性和意定的信宿。
     消息的源和宿的认证可使用数字签名技术和身份识别技术,常用的方法有两种:一种方法是通信双方事先约定发送消息的数据加密密钥,接收者只需证实发送来的消息是否能用该密钥还原成明文就能鉴定发送者。如果双方使用同一个数据加密密钥,那么只需在消息中嵌入发送者的识别符即可。另一种方法是通信双方事先约定各自发送消息所使用的通行字,发送消息中含有此通行字并进行加密,接收者只需判别消息中解密的通行字是否等于约定的通行字就能鉴定发送者。为了安全起见,通行字应该是可变的。
     消息的序号和时间性的认证主要是阻止消息的重放攻击。常用的方法有:消息的流水作业号、链接认证符,随机数认证法和时戳等。消息内容的认证即消息的完整性检验常用的方法是:消息发送者在消息中加入一个认证码并经加密后发送给接收者检验(有时只需加密认证码即可),接收者利用约定的算法对解密后的消息进行运算,将得到的认证码与收到的认证码进行比较,若二者相等,则接收,否则拒绝接收。目前实现这种方法的基本途径有两条:一条是采用消息认证码(MAC),另一条是采用窜改检测码(MDC)。MAC法利用函数f(x)(f(x)必须满足一定的条件)和密钥k将要发送的明文x或密文y变换成r比特的消息认证码f(x,k)或称其为认证符附加在x或y 之后发出,通常将f选为带密钥的杂凑函数。MDC法利用函数f(x)(f(x)必须满足一定的条件)将要发送的明文x变换成r比特的窜改检测码f(x)附加在x之后,在一起加密事先保密认证。当然,也可以只对窜改检测码f(x)加密。通常将f选为不带密钥的杂凑函数。接收者收到发送的消息后,按照发送这同样的方法对接收的数据或解密后的数据的前面部分进行计算,得到相应的r比特串,然后与接收恢复的r比特串逐位进行比较,若完全相同,则认为收到的消息未被窜改,否则,认为收到的消息已被窜改。
    三,密钥管理技术
      根据密码假设,一个密码系统的安全性取决于对密钥的保护,而不是对系统或硬件本身的保护。即使在密码体制公开或密码设备丢失的情况下,同一型号的密码机仍可继续使用。然而一旦密钥丢失或出错,不但合法用户不能提取信息,而且可能会是非法用户窃取信息。密钥的保密和安全管理在数据系统安全中是极为重要的 。
     密钥管理包括密钥的产生、存储、装入、分配、保护、丢失、销毁等内容.其中密钥的分配和存储可能是最棘手的问题.密钥管理不仅影响系统的安全性,而且涉及到系统的可靠性、有效性和经济性。当然,密钥管理过程中也不可能避免物理上、人事上、规程上等一些问题。
    1. 密钥分配协定
      密钥分配协定是这样的一种机制:系统中的一个成员先选择一个秘密密钥,然后将它传送另一个成员或别的成员。传统的方法是通过邮递或信使护送密钥。这种方法的安全性完全取决于信使的忠诚和素质,当很难完全消除信使被收买的可能性。另外,这种方法的传输量和存储量都很大。人们希望能设计出满足以下两个条件的密钥分配协议:
    1.传输量和存储量都比较小。
    2.每一对用户U和V都能独立地计算一个秘密密钥K。
     目前已经设计出了大量的满足上述两个条件的密钥分配协议,诸如Blom密钥分配协议,Diffie-Hellman密钥预分配协议、Kerboros 密钥分配协议、基于身份的密钥分配协议等。
     密钥协定是一个协议,它通过两个或多个成员在一个公开的信道上通信联络建立一个秘密密钥。在一个密钥协定方案中,密钥的值是由两个成员提供的输入的一个函数。现有的密钥协定方案有Diffie-Hellman密钥交换协议、MTI密钥协定方案、Girault密钥协定方案等。
    2. 秘密共享技术
     存储在系统中所有密钥的安全性可能最终取决于一个主密钥。这样做存在两个明显的缺陷:一是若主密钥偶然或有意地被暴露,整个系统就易受攻击;二是若主密钥丢失或损坏,系统中的所有信息就不能用了。关于这个问题,Shamir于1979年提出了一种解决方法,称为门限法,实质上是一种秘密共享的思想。这种方法的基本观点是:讲一个密钥K按下述方式破成n个小片k1,k2,......,kn:
    1.已知任意t个Ki的值易于计算出K。
    2.已知任意t---1个或更少个Ki,则由于信息短缺而不能确定出k。
     将n个小片分给n个用户。由于要重构密钥需要t个小片,故暴露一个小片或大到t-1个小片不会危及密钥,且少于t-1个用户不可能共谋到密钥,同时,若一个小片被丢失或损坏,认可恢复密钥(只要至少有t个有效的小片)。
     人们基于拉格朗日内插多项式法、射影几何、线性代数、孙子定理等提出了许多秘密共享方案。
    3. 密钥托管技术
     加密技术既可以帮助守法公民和企业保密,又可以被犯罪分子用于掩护其犯罪事实,这就为政府管理社会,法律执行部门跟踪犯罪分子带来了一定的困难。从国家的利益考虑,应该能控制加密技术的使用。美国于1993年提出的密钥托管加密技术正符合这种要求。密钥托管有时也叫做密钥恢复。现在密钥托管已经是一些系统的派生术语,包括密钥恢复、受信任的第三方、特别获取、数据恢复等。近几年,密钥托管加密技术已成为密码技术研究和应用的焦点。
     美国政府于1993年4月16日通过美国商业部颁布了具有密钥托管功能的加密标准(EES)。该标准规定使用专门授权制造的且算法(将该算法称之为Skipjack算法,目前已公布)不予公布的Clipper芯片实施商用加密。Clipper芯片是实现了EES标准的防窜扰芯片,它是由美国国家安全局(NSA)主持开发的硬件实现的密码部件。由于加密体制具有在法律许可时可以进行密钥合成的功能,所以政府在必要时无须花费巨大代价破译密码,而能够直接侦听。目前我们可以从网上搜集到近40种不同功能的密钥托管系统。。。。。。
     
    展开全文
  • 数据加密几种方法

    千次阅读 2014-03-05 16:45:58
    常用加密算法比较 Hash算法  hash算法的意义在于提供了一种快速存取数据的方法,它用一种算法建立键值与真实值之间的对应关系,(每一个真实值只能有一个键值,但是一个键值可以对应多个真实值),这样可以快速在数组等...

    常用加密算法比较

    Hash算法

        hash算法的意义在于提供了一种快速存取数据的方法,它用一种算法建立键值与真实值之间的对应关系,(每一个真实值只能有一个键值,但是一个键值可以对应多个真实值),这样可以快速在数组等条件中里面存取数据.

     

    MD5算法

       MD5的全称是Message-Digest Algorithm 5(信息-摘要算法),在90年代初由MITLaboratoryfor Computer Science和RSA Data Security Inc的Ronald L. Rivest开发出来,经MD2、MD3和MD4发展而来。它的作用是让大容量信息在用数字签名软件签署私人密匙前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的大整数)。不管是MD2、MD4还是MD5,它们都需要获得一个随机长度的信息并产生一个128位的信息摘要。虽然这些算法的结构或多或少有些相似,但MD2的设计与MD4和MD5完全不同,那是因为MD2是为8位机器做过设计优化的,而MD4和MD5却是面向32位的电脑。这三个算法的描述和C语言源代码在Internet RFCs 1321中有详细的描述(http://www.ietf.org/rfc/rfc1321.txt),这是一份最权威的文档,由RonaldL. Rivest在1992年8月向IEFT提交。

       Van Oorschot和Wiener曾经考虑过一个在散列中暴力搜寻冲突的函数(Brute-Force HashFunction),而且他们猜测一个被设计专门用来搜索MD5冲突的机器(这台机器在1994年的制造成本大约是一百万美元)可以平均每24天就找到一个冲突。但单从1991年到2001年这10年间,竟没有出现替代MD5算法的MD6或被叫做其他什么名字的新算法这一点,我们就可以看出这个瑕疵并没有太多的影响MD5的安全性。上面所有这些都不足以成为MD5的在实际应用中的问题。并且,由于MD5算法的使用不需要支付任何版权费用的,所以在一般的情况下(非绝密应用领域。但即便是应用在绝密领域内,MD5也不失为一种非常优秀的中间技术),MD5怎么都应该算得上是非常安全的了。

      算法的应用

      MD5的典型应用是对一段信息(Message)产生信息摘要(Message-Digest),以防止被篡改。比如,在UNIX下有很多软件在下载的时候都有一个文件名相同,文件扩展名为.md5的文件,在这个文件中通常只有一行文本,大致结构如:

         MD5 (tanajiya.tar.gz) = 0ca175b9c0f726a831d895e269332461

         这就是tanajiya.tar.gz文件的数字签名。MD5将整个文件当作一个大文本信息,通过其不可逆的字符串变换算法,产生了这个唯一的MD5信息摘要。如果在以后传播这个文件的过程中,无论文件的内容发生了任何形式的改变(包括人为修改或者下载过程中线路不稳定引起的传输错误等),只要你对这个文件重新计算MD5时就会发现信息摘要不相同,由此可以确定你得到的只是一个不正确的文件。如果再有一个第三方的认证机构,用MD5还可以防止文件作者的"

    抵赖",这就是所谓的数字签名应用。

      MD5还广泛用于加密和解密技术上。比如在UNIX系统中用户的密码就是以MD5(或其它类似的算法)经加密后存储在文件系统中。当用户登录的时候,系统把用户输入的密码计算成MD5值,然后再去和保存在文件系统中的MD5值进行比较,进而确定输入的密码是否正确。通过这样的步骤,系统在并不知道用户密码的明码的情况下就可以确定用户登录系统的合法性。这不但可以避免用户的密码被具有系统管理员权限的用户知道,而且还在一定程度上增加了密码被破解的难度。

      正是因为这个原因,现在被黑客使用最多的一种破译密码的方法就是一种被称为"跑字典"的方法。有两种方法得到字典,一种是日常搜集的用做密码的字符串表,另一种是用排列组合方法生成的,先用MD5程序计算出这些字典项的MD5值,然后再用目标的MD5值在这个字典中检索。我们假设密码的最大长度为8位字节(8 Bytes),同时密码只能是字母和数字,共26+26+10=62个字符,排列组合出的字典的项数则是P(62,1)+P(62,2)….+P(62,8),那也已经是一个很天文的数字了,存储这个字典就需要TB级的磁盘阵列,而且这种方法还有一个前提,就是能获得目标账户的密码MD5值的情况下才可以。这种加密技术被广泛的应用于UNIX系统中,这也是为什么UNIX系统比一般操作系统更为坚固一个重要原因。

      算法描述

      对MD5算法简要的叙述可以为:MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。

      在MD5算法中,首先需要对信息进行填充,使其字节长度对512求余的结果等于448。因此,信息的字节长度(Bits Length)将被扩展至N*512+448,即N*64+56个字节(Bytes),N为一个正整数。填充的方法如下,在信息的后面填充一个1和无数个0,直到满足上面的条件时才停止用0对信息的填充。然后,在在这个结果后面附加一个以64位二进制表示的填充前信息长度。经过这两步的处理,现在的信息字节长度=N*512+448+64=(N+1)*512,即长度恰好是512的整数倍。这样做的原因是为满足后面处理中对信息长度的要求。

      MD5中有四个32位被称作链接变量(Chaining Variable)的整数参数,他们分别为:A=0x01234567,B=0x89abcdef,C=0xfedcba98,D=0x76543210。

      当设置好这四个链接变量后,就开始进入算法的四轮循环运算。循环的次数是信息中512位信息分组的数目。

      将上面四个链接变量复制到另外四个变量中:A到a,B到b,C到c,D到d。

      主循环有四轮(MD4只有三轮),每轮循环都很相似。第一轮进行16次操作。每次操作对a、b、c和d中的其中三个作一次非线性函数运算,然后将所得结果加上第四个变量,文本的一个子分组和一个常数。再将所得结果向右环移一个不定的数,并加上a、b、c或d中之一。最后用该结果取代a、b、c或d中之一。

    以一下是每次操作中用到的四个非线性函数(每轮一个)。

       F(X,Y,Z) =(X&Y)|((~X)&Z)

       G(X,Y,Z) =(X&Z)|(Y&(~Z))

       H(X,Y,Z) =X^Y^Z

       I(X,Y,Z)=Y^(X|(~Z))

       (&是与,|是或,~是非,^是异或)

      这四个函数的说明:如果X、Y和Z的对应位是独立和均匀的,那么结果的每一位也应是独立和均匀的。F是一个逐位运算的函数。即,如果X,那么Y,否则Z。函数H是逐位奇偶操作符。

      假设Mj表示消息的第j个子分组(从0到15),<<FF(a,b,c,d,Mj,s,ti)表示a=b+((a+(F(b,c,d)+Mj+ti)<<GG(a,b,c,d,Mj,s,ti)表示a=b+((a+(G(b,c,d)+Mj+ti)<<HH(a,b,c,d,Mj,s,ti)表示a=b+((a+(H(b,c,d)+Mj+ti)<<II(a,b,c,d,Mj,s,ti)表示a=b+((a+(I(b,c,d)+Mj+ti)<<

      这四轮(64步)是:

      第一轮

       FF(a,b,c,d,M0,7,0xd76aa478)

       FF(d,a,b,c,M1,12,0xe8c7b756)

       FF(c,d,a,b,M2,17,0x242070db)

             FF(b,c,d,a,M3,22,0xc1bdceee)

       FF(a,b,c,d,M4,7,0xf57c0faf)

       FF(d,a,b,c,M5,12,0x4787c62a)

       FF(c,d,a,b,M6,17,0xa8304613)

       FF(b,c,d,a,M7,22,0xfd469501)

       FF(a,b,c,d,M8,7,0x698098d8)

       FF(d,a,b,c,M9,12,0x8b44f7af)

       FF(c,d,a,b,M10,17,0xffff5bb1)

       FF(b,c,d,a,M11,22,0x895cd7be)

       FF(a,b,c,d,M12,7,0x6b901122)

       FF(d,a,b,c,M13,12,0xfd987193)

       FF(c,d,a,b,M14,17,0xa679438e)

       FF(b,c,d,a,M15,22,0x49b40821)

      第二轮

       GG(a,b,c,d,M1,5,0xf61e2562)

       GG(d,a,b,c,M6,9,0xc040b340)

       GG(c,d,a,b,M11,14,0x265e5a51)

       GG(b,c,d,a,M0,20,0xe9b6c7aa)

       GG(a,b,c,d,M5,5,0xd62f105d)

       GG(d,a,b,c,M10,9,0x02441453)

       GG(c,d,a,b,M15,14,0xd8a1e681)

       GG(b,c,d,a,M4,20,0xe7d3fbc8)

       GG(a,b,c,d,M9,5,0x21e1cde6)

       GG(d,a,b,c,M14,9,0xc33707d6)

       GG(c,d,a,b,M3,14,0xf4d50d87)

       GG(b,c,d,a,M8,20,0x455a14ed)

       GG(a,b,c,d,M13,5,0xa9e3e905)

       GG(d,a,b,c,M2,9,0xfcefa3f8)

       GG(c,d,a,b,M7,14,0x676f02d9)

       GG(b,c,d,a,M12,20,0x8d2a4c8a)

      第三轮

       HH(a,b,c,d,M5,4,0xfffa3942)

       HH(d,a,b,c,M8,11,0x8771f681)

       HH(c,d,a,b,M11,16,0x6d9d6122)

       HH(b,c,d,a,M14,23,0xfde5380c)

       HH(a,b,c,d,M1,4,0xa4beea44)

       HH(d,a,b,c,M4,11,0x4bdecfa9)

       HH(c,d,a,b,M7,16,0xf6bb4b60)

       HH(b,c,d,a,M10,23,0xbebfbc70)

       HH(a,b,c,d,M13,4,0x289b7ec6)

       HH(d,a,b,c,M0,11,0xeaa127fa)

       HH(c,d,a,b,M3,16,0xd4ef3085)

       HH(b,c,d,a,M6,23,0x04881d05)

       HH(a,b,c,d,M9,4,0xd9d4d039)

       HH(d,a,b,c,M12,11,0xe6db99e5)

       HH(c,d,a,b,M15,16,0x1fa27cf8)

       HH(b,c,d,a,M2,23,0xc4ac5665)

      第四轮

       II(a,b,c,d,M0,6,0xf4292244)

       II(d,a,b,c,M7,10,0x432aff97)

       II(c,d,a,b,M14,15,0xab9423a7)

       II(b,c,d,a,M5,21,0xfc93a039)

       II(a,b,c,d,M12,6,0x655b59c3)

       II(d,a,b,c,M3,10,0x8f0ccc92)

       II(c,d,a,b,M10,15,0xffeff47d)

       II(b,c,d,a,M1,21,0x85845dd1)

       II(a,b,c,d,M8,6,0x6fa87e4f)

       II(d,a,b,c,M15,10,0xfe2ce6e0)

       II(c,d,a,b,M6,15,0xa3014314)

       II(b,c,d,a,M13,21,0x4e0811a1)

       II(a,b,c,d,M4,6,0xf7537e82)

       II(d,a,b,c,M11,10,0xbd3af235)

       II(c,d,a,b,M2,15,0x2ad7d2bb)

       II(b,c,d,a,M9,21,0xeb86d391)

      常数ti可以如下选择

      在第i步中,ti是4294967296*abs(sin(i))的整数部分,i的单位是弧度。(4294967296等于2的32次方)所有这些完成之后,将A、B、C、D分别加上a、b、c、d。然后用下一分组数据继续运行算法,

    最后的输出是A、B、C和D的级联。

      当你按照我上面所说的方法实现MD5算法以后,你可以用以下几个信息对你做出来的程序作一个简单的测试,看看程序有没有错误。

       MD5 ("") = d41d8cd98f00b204e9800998ecf8427e

       MD5 ("a") = 0cc175b9c0f1b6a831c399e269772661

       MD5 ("abc") = 900150983cd24fb0d6963f7d28e17f72

       MD5 ("message digest") = f96b697d7cb7938d525a2f31aaf161d0

       MD5 ("abcdefghijklmnopqrstuvwxyz") =c3fcd3d76192e4007dfb496cca67e13b

       MD5 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789")=

    d174ab98d277d9f5a5611c2c9f419d9f

       MD5("123456789012345678901234567890123456789012345678901234567890123456789

    01234567890") =57edf4a22be3c955ac49da2e2107b67a

      MD5的安全性

      MD5相对MD4所作的改进:

       1. 增加了第四轮;

       2. 每一步均有唯一的加法常数;

       3. 为减弱第二轮中函数G的对称性从(X&Y)|(X&Z)|(Y&Z)变为(X&Z)|(Y&(~Z));

       4. 第一步加上了上一步的结果,这将引起更快的雪崩效应;

       5. 改变了第二轮和第三轮中访问消息子分组的次序,使其更不相似;

       6. 近似优化了每一轮中的循环左移位移量以实现更快的雪崩效应。各轮的位移量互不相同。

    RSA算法

    RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。 RSA的算法涉及三个参数,n、e1、e2。其中,n是两个大质数p、q的积,n的二进制表示时所占用的位数,就是所谓的密钥长度。 e1和e2是一对相关的值,e1可以任意取,但要求e1与(p-1)*(q-1)互质;再选择e2,要求

    (e2*e1)mod((p-1)*(q-1))=1。

    (n及e1),(n及e2)就是密钥对。

    RSA加解密的算法完全相同,设A为明文,B为密文,则:A=B^e1mod n;B=A^e2 mod n;

    e1和e2可以互换使用,即:

    A=B^e2 mod n;B=A^e1 mod n;

    补充:

    对明文进行加密,有两种情况需要这样作:

    1、您向朋友传送加密数据,您希望只有您的朋友可以解密,这样的话,您需要首先获取您朋友的密钥对中公开的那一个密钥,e及n。然后用这个密钥进行加密,这样密文只有您的朋友可以解密,因为对应的私钥只有您朋友拥有。

    2、您向朋友传送一段数据附加您的数字签名,您需要对您的数据进行MD5之类的运算以取得数据的"指纹",再对"指纹"进行加密,加密将使用您自己的密钥对中的不公开的私钥。您的朋友收到数据后,用同样的运算获得数据指纹,再用您的公钥对加密指纹进行解密,比较解密结果与他自己计算出来的指纹是否一致,即可确定数据是否的确是您发送的、以及在传输过程中是否被篡改。

    密钥的获得,通常由某个机构颁发(如CA中心),当然也可以由您自己创建密钥,但这样作,

    您的密钥并不具有权威性。

    计算方面,按公式计算就行了,如果您的加密强度为1024位,则结果会在有效数据前面补0以补齐不足的位数。补入的0并不影响解密运算。

    DES算法

    DES(Data Encryption Standard)满足了国家标准局欲达到的4个目的:提供高质量的数据保护,防止数据未经授权的泄露和未被察觉的修改;具有相当高的复杂性,使得破译的开销超过可能获得的利益,同时又要便于理解和掌握;

    DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位,首先,DES把输入的64位数据块按位重新组合,并把输出分为L0、R0两部分,每部分各长32位,并进行前后置换(输入的第58位换到第一位,第50位换到第2位,依此类推,最后一位是原来的第7位),最终由L0输出左32位,R0输出右32位,根据这个法则经过16次迭代运算后,得到L16、R16,将此作为输入,进行与初始置换相反的逆置换,即得到密文输出。

       DES算法的入口参数有三个:Key、Data、Mode。其中Key为8个字节共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密,如果Mode为加密,则用Key去把数据Data进行加密,生成Data的密码形式作为DES的输出结果;如Mode为解密,则用Key去把密码形式的数据Data解密,还原为Data的明码形式作为DES的输出结果。在使用DES时,双方预先约定使用的”密码”即Key,然后用Key去加密数据;接收方得到密文后使用同样的Key解密得到原数据,这样便实现了安全性较高的数据传输。

    展开全文
  • 常用数据加密和解密方法

    千次阅读 2018-07-17 13:54:07
    关键词:数据加密用哪种方式更好? ASP.NET(C#)常用数据加密和解密方法汇总  一、数据加密的概念 1、 基本概念 2、 基本功能 3、 加密形式  二、 数据加密的项目应用和学习 1、 媒体加密:DRM 2、 ...

    http://www.cnblogs.com/sunxuchu/p/5484018.html

    关键词:数据加密用哪种方式更好?

    ASP.NET(C#)常用数据加密和解密方法汇总 

    一、数据加密的概念

    1、  基本概念

    2、  基本功能

    3、  加密形式 

    二、 数据加密的项目应用和学习

    1、  媒体加密:DRM

    2、  文件加密:文本加密、pdf、word

    3、  数据加密:ASP.NET(C#)中的数据加密

    4、  硬件加密:加密狗

    三、 数据加密的发展趋势 

    四、 网络数据加密算法分类

    1、  根本不考虑解密问题:MD5、

    2、  私用密钥加密:DES、AES

    3、  公用密钥加密:RSA

    4、  数字证书: 

    五、对称加密之DES加密和解密的讲解 

    六、 非对称加密之RSA加密和解密的讲解 

    七、 ASP.NET(C#) 常用加密类实例调用讲解

    ASP.NET(C#)常用数据加密和解密方法汇总 

      

    数据加密技术是网络中最基本的安全技术,主要是通过对网络中传输的信息进行数据加密来保障其安全性,这是一种主动安全防御策略,用很小的代价即可为信息提供相当大的安全保护。

    一、加密的基本概念 

    "加密",是一种限制对网络上传输数据的访问权的技术。原始数据(也称为明文,plaintext)被加密设备(硬件或软件)和密钥加密而产生的经过编码的数据称为密文(ciphertext)。将密文还原为原始明文的过程称为解密,它是加密的反向处理,但解密者必须利用相同类型的加密设备和密钥对密文进行解密。

    加密的基本功能包括:

    1. 防止不速之客查看机密的数据文件;

    2. 防止机密数据被泄露或篡改;

    3. 防止特权用户(如系统管理员)查看私人数据文件;

    4. 使入侵者不能轻易地查找一个系统的文件。

    数据加密是确保计算机网络安全的一种重要机制,虽然由于成本、技术和管理上的复杂性等原因,目前尚未在网络中普及,但数据加密的确是实现分布式系统和网络环境下数据安全的重要手段之一。

    数据加密可在网络OSI七层协议(OSIOpen System Interconnect的缩写,意为开放式系统互联。国际标准组织(国际标准化组织)制定了OSI模型。这个模型把网络通信的工作分为7层,分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。)的多层上实现、所以从加密技术应用的逻辑位置看,有三种方式:

    链路加密:通常把网络层以下的加密叫链路加密,主要用于保护通信节点间传输的数据,加解密由置于线路上的密码设备实现。根据传递的数据的同步方式又可分为同步通信加密和异步通信加密两种,同步通信加密又包含字节同步通信加密和位同步通信加密。

    节点加密:是对链路加密的改进。在协议传输层上进行加密,主要是对源节点和目标节点之间传输数据进行加密保护,与链路加密类似.只是加密算法要结合在依附于节点的加密模件中,克服了链路加密在节点处易遭非法存取的缺点。

    端对端加密:网络层以上的加密称为端对端加密。是面向网络层主体。对应用层的数据信息进行加密,易于用软件实现,且成本低,但密钥管理问题困难,主要适合大型网络系统中信息在多个发方和收方之间传输的情况。

    二、数据加密的应用 

    1、  媒体加密:DRM

    2、  文件加密:文本加密、pdf、word

    3、  数据加密:ASP.NET(C#)中的数据加密

    4、  硬件加密:加密狗

     

    三.加密技术发展趋势 

    私用密钥加密技术与公开密钥加密技术相结合:鉴于两种密码体制加密的特点,在实际应用中可以采用折衷方案,即结合使用DES/IDEA和RSA,以DES为"内核",RSA为"外壳",对于网络中传输的数据可用DES或IDEA加密,而加密用的密钥则用RSA加密传送,此种方法既保证了数据安全又提高了加密和解密的速度,这也是目前加密技术发展的新方向之一。

    寻求新算法:跳出以常见的迭代为基础的构造思路,脱离基于某些数学问题复杂性的构造方法。如刘尊全先生提出的刘氏算法,是一种基于密钥的公开密钥体制,它采用了随机性原理构造加解密变换,并将其全部运算控制隐匿于密钥中,密钥长度可变。它是采用选取一定长度的分割来构造大的搜索空间,从而实现一次非线性变换。此种加密算法加密强度高、速度快、计算开销低。

    加密最终将被集成到系统和网络中,例如IPV6协议就已有了内置加密的支持,在硬件方面,Intel公司正研制一种加密协处理器。它可以集成到微机的主极上。

    四、加密技术的分类 

    加密类型可以简单地分为四种:

    1. 根本不考虑解密问题; 

    2. 私用密钥加密技术:对称式加密(Symmetric Key Encryption):对称式加密方式对加密和解密使用相同的密钥。通常,这种加密方式在应用中难以实施,因为用同一种安全方式共享密钥很难。如:RC4、RC2、DES 和 AES 系列加密算法。

    3. 公开密钥加密技术:非对称密钥加密(Asymmetric Key Encryption):非对称密钥加密使用一组公共/私人密钥系统,加密时使用一种密钥,解密时使用另一种密钥。公共密钥可以广泛的共享和透露。当需要用加密方式向服务器外部传送数据时,这种加密方式更方便。如: RSA

    4. 数字证书。(Certificate):数字证书是一种非对称密钥加密,但是,一个组织可以使用证书并通过数字签名将一组公钥和私钥与其拥有者相关联。 

    五、对称加密之DES加密与解密 

    一、  对称加密 

    对称加密,是一种比较传统的加密方式,其加密运算、解密运算使用的是同样的密钥,信息的发送者和信息的接收者在进行信息的传输与处理时,必须共同持有该密码(称为对称密码)。因此,通信双方都必须获得这把钥匙,并保持钥匙的秘密。

    单钥密码系统的安全性依赖于以下两个因素:

    第一、加密算法必须是足够强的,仅仅基于密文本身去解密信息在实践上是不可能的。

    第二、加密方法的安全性依赖于密钥的秘密性,而不是算法的秘密性,因此,我们没有必要确保算法的秘密性(事实上,现实中使用的很多单钥密码系统的算法都是公开的),但是我们一定要保证密钥的秘密性。

    DES(Data Encryption Standard)和TripleDES是对称加密的两种实现。

    DES和TripleDES基本算法一致,只是TripleDES算法提供的key位数更多,加密可靠性更高。

    DES使用的密钥key为8字节,初始向量IV也是8字节。

    TripleDES使用24字节的key,初始向量IV也是8字节。

    两种算法都是以8字节为一个块进行加密,一个数据块一个数据块的加密,一个8字节的明文加密后的密文也是8字节。如果明文长度不为8字节的整数倍,添加值为0的字节凑满8字节整数倍。所以加密后的密文长度一定为8字节的整数倍。

    二、  加密解密过程 

     

    Figure 1. DES加密解密过程

    上图是整个DES和TripleDES算法的加密解密过程,下面以TripleDES为例,结合dotnet分析加密解密的各个步骤,并给出相关实现代码。

    1 生成keyIV

    System.Security.Cryptography. TripleDESCryptoServiceProvider类是dotnet中实现TripleDES算法的主要的类。

    TripleDESCryptoServiceProvider类只有一个构造方法TripleDESCryptoServiceProvider(),这个方法把一些属性初始化:

    KeySize(加密密钥长度,以位为单位)= 192(24字节)

    BlockSize(加密处理的数据块大小,以位为单位)= 64(8字节)

    FeedbackSize(加密数据块后返回的数据大小,以位为单位)= 64(8字节)

     

    TripleDESCryptoServiceProvider构造方法同时会初始化一组随机的key和IV。

    默认的TripleDESCryptoServiceProvider的key为24字节,IV为8字节,加密数据块为8字节。

    生成key和IV的代码很简单:

    TripleDESCryptoServiceProvider tDESalg = new TripleDESCryptoServiceProvider();
    byte[] keyArray = tDESalg.Key;
    byte[] IVArray = tDESalg.IV;

    生成的key和IV在加密过程和解密过程都要使用。

    2 字符串明文转成某一代码页对应的编码字节流 

    待加密的数据可能有两种形式,一种是二进制的数据,本身就是一组字节流,这样的数据可以跳过这一步,直接进入加密步骤。还有一种情况是字符串数据,字符串中同样的字符使用不同的代码页会生成不同的字节码,所以从字符串到字节流的转换是需要指定使用何种编码的。在解密之后,要从字节流转换到字符串就要使用相同的代码页解码,否则就会出现乱码。

    // 待加密的字符串

    string plainTextString = "Here is some data to encrypt. 这里是一些要加密的数据。";

    // 使用utf-8编码(也可以使用其它的编码)

    Encoding sEncoding = Encoding.GetEncoding("utf-8");

    // 把字符串明文转换成utf-8编码的字节流

    byte[] plainTextArray = sEncoding.GetBytes(plainTextString);

     

    3 加密操作 

    加密的原料是明文字节流,TripleDES算法对字节流进行加密,返回的是加密后的字节流。同时要给定加密使用的key和IV。

    // 把字符串明文转换成utf-8编码的字节流

    复制代码

    byte[] plainTextArray = sEncoding.GetBytes(plainTextString);
    public static byte[] EncryptString(byte[] plainTextArray, byte[] Key, byte[] IV)
    {
        // 建立一个MemoryStream,这里面存放加密后的数据流
        MemoryStream mStream = new MemoryStream();
        // 使用MemoryStream 和key、IV新建一个CryptoStream 对象
        CryptoStream cStream = new CryptoStream(mStream,
            new TripleDESCryptoServiceProvider().CreateEncryptor(Key, IV),
            CryptoStreamMode.Write);
        // 将加密后的字节流写入到MemoryStream
        cStream.Write(plainTextArray, 0, plainTextArray.Length);
        //把缓冲区中的最后状态更新到MemoryStream,并清除cStream的缓存区
        cStream.FlushFinalBlock();
        // 把解密后的数据流转成字节流
        byte[] ret = mStream.ToArray();
        // 关闭两个streams.
        cStream.Close();
        mStream.Close();
        return ret;
    }

    复制代码

    4 解密操作 

    解密操作解密上面步骤生成的密文byte[],需要使用到加密步骤使用的同一组Key和IV。

    // 调用解密方法,返回已解密数据的byte[]

    复制代码

    byte[] finalPlainTextArray = DecryptTextFromMemory(Data, keyArray, IVArray);
    public static byte[] DecryptTextFromMemory(byte[] EncryptedDataArray, byte[] Key, byte[] IV)
    {
        // 建立一个MemoryStream,这里面存放加密后的数据流
        MemoryStream msDecrypt = new MemoryStream(EncryptedDataArray);
        // 使用MemoryStream 和key、IV新建一个CryptoStream 对象
        CryptoStream csDecrypt = new CryptoStream(msDecrypt,
            new TripleDESCryptoServiceProvider().CreateDecryptor(Key, IV),
            CryptoStreamMode.Read);
        // 根据密文byte[]的长度(可能比加密前的明文长),新建一个存放解密后明文的byte[]
        byte[] DecryptDataArray = new byte[EncryptedDataArray.Length];
        // 把解密后的数据读入到DecryptDataArray
        csDecrypt.Read(DecryptDataArray, 0, DecryptDataArray.Length);
        msDecrypt.Close();
        csDecrypt.Close();
        return DecryptDataArray;
    }

    复制代码

    有一点需要注意,DES加密是以数据块为单位加密的,8个字节一个数据块,如果待加密明byte[]的长度不是8字节的整数倍,算法先用值为“0”的byte补足8个字节,然后进行加密。所以加密后的密文长度一定是8的整数倍。这样的密文解密后如果补了0值的byte,则解密后这些0值的byte依然存在。比如上例中要加密的明文是:

    “Here is some data to encrypt. 这里是一些要加密的数据。”

    转成明文byte[]后是66个字节,DES算法就会补上6个0值的byte,补到72个字节。这样加密后再解密回来的密文byte[]解码后的字符串就是这样的:

    "Here is some data to encrypt. 这里是一些要加密的数据。\0\0\0\0\0\0"

    5 从编码字节流转成字符串明文 

    // 使用前面定义的Encoding,utf-8的编码把byte[]转成字符串

    plainTextString = sEncoding.GetString(finalPlainTextArray);

    六、非对称加密之RSA加密和解密的讲解 

          RSA公钥加密算法是1977年由Ron Rivest、Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的。RSA取名来自开发他们三者的名字。RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的所有密码攻击,已被ISO推荐为公钥数据加密标准。RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作。

      RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。RSA的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难度等价。即RSA的重大缺陷是无法从理论上把握它的保密性能如何,而且密码学界多数人士倾向于因子分解不是NPC问题。

      RSA的缺点主要有:

    A)产生密钥很麻烦,受到素数产生技术的限制,因而难以做到一次一密。

    B)分组长度太大,为保证安全性,n 至少也要 600bits以上,使运算代价很高,尤其是速度较慢,较对称密码算法慢几个数量级;且随着大数分解技术的发展,这个

    长度还在增加,不利于数据格式的标准化。目前,SET(Secure Electronic Transaction)协议中要求CA采用2048bits长的密钥,其他实体使用1024比特的密钥。C)RSA密钥长度随着保密级别提高,增加很快。下表列出了对同一安全级别所对应的密钥长度。

     

    保密级别

    对称密钥长度(bit)

    RSA密钥长度(bit)

    ECC密钥长度(bit)

    保密年限

    80

    80

    1024

    160

    2010

    112

    112

    2048

    224

    2030

    128

    128

    3072

    256

    2040

    192

    192

    7680

    384

    2080

    256

    256

    15360

    512

    2120

     这种算法1978年就出现了,它是第一个既能用于数据加密也能用于数字签名的算法。它易于理解和操作,也很流行。算法的名字以发明者的名字命名:Ron Rivest, AdiShamir 和Leonard Adleman。早在1973年,英国国家通信总局的数学家Clifford Cocks就发现了类似的算法。但是他的发现被列为绝密,直到1998年才公诸于世。

      RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。

      RSA的算法涉及三个参数,n、e1、e2。

      其中,n是两个大质数p、q的积,n的二进制表示时所占用的位数,就是所谓的密钥长度。

      e1和e2是一对相关的值,e1可以任意取,但要求e1与(p-1)*(q-1)互质;再选择e2,要求(e2*e1)mod((p-1)*(q-1))=1。

      (n及e1),(n及e2)就是密钥对。

      RSA加解密的算法完全相同,设A为明文,B为密文,则:A=B^e1 mod n;B=A^e2 mod n;

      e1和e2可以互换使用,即:

      A=B^e2 mod n;B=A^e1 mod n;

     

    C#代码实现

    需引用using System.Security.Cryptography;

    复制代码

    /// <summary>
            /// RSA加密
            /// </summary>
            /// <param name="publickey"></param>
            /// <param name="content"></param>
            /// <returns></returns>
            public static string RSAEncrypt(string publickey, string content)
            {
                publickey = @"<RSAKeyValue><Modulus>5m9m14XH3oqLJ8bNGw9e4rGpXpcktv9MSkHSVFVMjHbfv+SJ5v0ubqQxa5YjLN4vc49z7SVju8s0X4gZ6AzZTn06jzWOgyPRV54Q4I0DCYadWW4Ze3e+BOtwgVU1Og3qHKn8vygoj40J6U85Z/PTJu3hN1m75Zr195ju7g9v4Hk=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>";
                RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
                byte[] cipherbytes;
                rsa.FromXmlString(publickey);
                cipherbytes = rsa.Encrypt(Encoding.UTF8.GetBytes(content), false);
    
                return Convert.ToBase64String(cipherbytes);
            }
    
            /// <summary>
            /// RSA解密
            /// </summary>
            /// <param name="privatekey"></param>
            /// <param name="content"></param>
            /// <returns></returns>
            public static string RSADecrypt(string privatekey, string content)
            {
                privatekey = @"<RSAKeyValue><Modulus>5m9m14XH3oqLJ8bNGw9e4rGpXpcktv9MSkHSVFVMjHbfv+SJ5v0ubqQxa5YjLN4vc49z7SVju8s0X4gZ6AzZTn06jzWOgyPRV54Q4I0DCYadWW4Ze3e+BOtwgVU1Og3qHKn8vygoj40J6U85Z/PTJu3hN1m75Zr195ju7g9v4Hk=</Modulus><Exponent>AQAB</Exponent><P>/hf2dnK7rNfl3lbqghWcpFdu778hUpIEBixCDL5WiBtpkZdpSw90aERmHJYaW2RGvGRi6zSftLh00KHsPcNUMw==</P><Q>6Cn/jOLrPapDTEp1Fkq+uz++1Do0eeX7HYqi9rY29CqShzCeI7LEYOoSwYuAJ3xA/DuCdQENPSoJ9KFbO4Wsow==</Q><DP>ga1rHIJro8e/yhxjrKYo/nqc5ICQGhrpMNlPkD9n3CjZVPOISkWF7FzUHEzDANeJfkZhcZa21z24aG3rKo5Qnw==</DP><DQ>MNGsCB8rYlMsRZ2ek2pyQwO7h/sZT8y5ilO9wu08Dwnot/7UMiOEQfDWstY3w5XQQHnvC9WFyCfP4h4QBissyw==</DQ><InverseQ>EG02S7SADhH1EVT9DD0Z62Y0uY7gIYvxX/uq+IzKSCwB8M2G7Qv9xgZQaQlLpCaeKbux3Y59hHM+KpamGL19Kg==</InverseQ><D>vmaYHEbPAgOJvaEXQl+t8DQKFT1fudEysTy31LTyXjGu6XiltXXHUuZaa2IPyHgBz0Nd7znwsW/S44iql0Fen1kzKioEL3svANui63O3o5xdDeExVM6zOf1wUUh/oldovPweChyoAdMtUzgvCbJk1sYDJf++Nr0FeNW1RB1XG30=</D></RSAKeyValue>";
                RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
                byte[] cipherbytes;
                rsa.FromXmlString(privatekey);
                cipherbytes = rsa.Decrypt(Convert.FromBase64String(content), false);
    
                return Encoding.UTF8.GetString(cipherbytes);
            }
    

    复制代码

    七、ASP.NET(C#)常用加密类调用的讲解

    1C#常用加密解密类库代码如下: 

    复制代码

    /// <summary>
          /// MD5 加密静态方法
          /// </summary>
          /// <param name="EncryptString">待加密的密文</param>
          /// <returns>returns</returns>
          public static string MD5Encrypt(string EncryptString)
          {
              if (string.IsNullOrEmpty(EncryptString)) { throw (new Exception("密文不得为空")); }
              MD5 m_ClassMD5 = new MD5CryptoServiceProvider();
              string m_strEncrypt = "";
              try
              {
                  m_strEncrypt = BitConverter.ToString(m_ClassMD5.ComputeHash(Encoding.Default.GetBytes(EncryptString))).Replace("-", "");
              }
             catch (ArgumentException ex) { throw ex; }
             catch (CryptographicException ex) { throw ex; }
             catch (Exception ex) { throw ex; }
              finally { m_ClassMD5.Clear(); }
              return m_strEncrypt;
          }
    
          /// <summary>
          /// DES 加密(数据加密标准,速度较快,适用于加密大量数据的场合)
          /// </summary>
          /// <param name="EncryptString">待加密的密文</param>
          /// <param name="EncryptKey">加密的密钥</param>
          /// <returns>returns</returns>
          public static string DESEncrypt(string EncryptString, string EncryptKey)
          {
              if (string.IsNullOrEmpty(EncryptString)) { throw (new Exception("密文不得为空")); }
              if (string.IsNullOrEmpty(EncryptKey)) { throw (new Exception("密钥不得为空")); }
              if (EncryptKey.Length != 8) { throw (new Exception("密钥必须为8位")); }
              byte[] m_btIV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
              string m_strEncrypt = "";
             DESCryptoServiceProvider m_DESProvider = new DESCryptoServiceProvider();
              try
              {
                  byte[] m_btEncryptString = Encoding.Default.GetBytes(EncryptString);
                  MemoryStream m_stream = new MemoryStream();
                  CryptoStream m_cstream = new CryptoStream(m_stream, m_DESProvider.CreateEncryptor(Encoding.Default.GetBytes(EncryptKey), m_btIV), CryptoStreamMode.Write);
                  m_cstream.Write(m_btEncryptString, 0, m_btEncryptString.Length);
                  m_cstream.FlushFinalBlock();
                  m_strEncrypt = Convert.ToBase64String(m_stream.ToArray());
                  m_stream.Close(); m_stream.Dispose();
                  m_cstream.Close(); m_cstream.Dispose();
              }
              catch (IOException ex) { throw ex; }
              catch (CryptographicException ex) { throw ex; }
              catch (ArgumentException ex) { throw ex; }
              catch (Exception ex) { throw ex; }
              finally { m_DESProvider.Clear(); }
              return m_strEncrypt;
          }
    
          /// <summary>
          /// DES 解密(数据加密标准,速度较快,适用于加密大量数据的场合)
          /// </summary>
          /// <param name="DecryptString">待解密的密文</param>
          /// <param name="DecryptKey">解密的密钥</param>
          /// <returns>returns</returns>
          public static string DESDecrypt(string DecryptString, string DecryptKey)
          {
             if (string.IsNullOrEmpty(DecryptString)) { throw (new Exception("密文不得为空")); }
              if (string.IsNullOrEmpty(DecryptKey)) { throw (new Exception("密钥不得为空")); }
              if (DecryptKey.Length != 8) { throw (new Exception("密钥必须为8位")); }
              byte[] m_btIV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
             string m_strDecrypt = "";
             DESCryptoServiceProvider m_DESProvider = new DESCryptoServiceProvider();
             try
            {
                 byte[] m_btDecryptString = Convert.FromBase64String(DecryptString);
                 MemoryStream m_stream = new MemoryStream();
                 CryptoStream m_cstream = new CryptoStream(m_stream, m_DESProvider.CreateDecryptor(Encoding.Default.GetBytes(DecryptKey), m_btIV), CryptoStreamMode.Write);
                 m_cstream.Write(m_btDecryptString, 0, m_btDecryptString.Length);
                 m_cstream.FlushFinalBlock();
                 m_strDecrypt = Encoding.Default.GetString(m_stream.ToArray());
                 m_stream.Close(); m_stream.Dispose();
                 m_cstream.Close(); m_cstream.Dispose();
             }
             catch (IOException ex) { throw ex; }
             catch (CryptographicException ex) { throw ex; }
             catch (ArgumentException ex) { throw ex; }
             catch (Exception ex) { throw ex; }
             finally { m_DESProvider.Clear(); }
             return m_strDecrypt;
         }
         /// <summary>
         /// RC2 加密(用变长密钥对大量数据进行加密)
         /// </summary>
         /// <param name="EncryptString">待加密密文</param>
         /// <param name="EncryptKey">加密密钥</param>
         /// <returns>returns</returns>
         public static string RC2Encrypt(string EncryptString, string EncryptKey)
         {
             if (string.IsNullOrEmpty(EncryptString)) { throw (new Exception("密文不得为空")); }
             if (string.IsNullOrEmpty(EncryptKey)) { throw (new Exception("密钥不得为空")); }
             if (EncryptKey.Length < 5 || EncryptKey.Length > 16) { throw (new Exception("密钥必须为5-16位")); }
             string m_strEncrypt = "";
             byte[] m_btIV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
             RC2CryptoServiceProvider m_RC2Provider = new RC2CryptoServiceProvider();
             try
            {
                 byte[] m_btEncryptString = Encoding.Default.GetBytes(EncryptString);
                 MemoryStream m_stream = new MemoryStream();
                 CryptoStream m_cstream = new CryptoStream(m_stream, m_RC2Provider.CreateEncryptor(Encoding.Default.GetBytes(EncryptKey), m_btIV), CryptoStreamMode.Write);
                 m_cstream.Write(m_btEncryptString, 0, m_btEncryptString.Length);
                 m_cstream.FlushFinalBlock();
                 m_strEncrypt = Convert.ToBase64String(m_stream.ToArray());
                 m_stream.Close(); m_stream.Dispose();
                m_cstream.Close(); m_cstream.Dispose();
             }
             catch (IOException ex) { throw ex; }
             catch (CryptographicException ex) { throw ex; }
             catch (ArgumentException ex) { throw ex; }
             catch (Exception ex) { throw ex; }
             finally { m_RC2Provider.Clear(); }
             return m_strEncrypt;
         }
    
         /// <summary>
         /// RC2 解密(用变长密钥对大量数据进行加密)
         /// </summary>
         /// <param name="DecryptString">待解密密文</param>
         /// <param name="DecryptKey">解密密钥</param>
         /// <returns>returns</returns>
         public static string RC2Decrypt(string DecryptString, string DecryptKey)
         {
             if (string.IsNullOrEmpty(DecryptString)) { throw (new Exception("密文不得为空")); }
             if (string.IsNullOrEmpty(DecryptKey)) { throw (new Exception("密钥不得为空")); }
            if (DecryptKey.Length < 5 || DecryptKey.Length > 16) { throw (new Exception("密钥必须为5-16位")); }
             byte[] m_btIV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
             string m_strDecrypt = "";
             RC2CryptoServiceProvider m_RC2Provider = new RC2CryptoServiceProvider();
            try
            {
                byte[] m_btDecryptString = Convert.FromBase64String(DecryptString);
                 MemoryStream m_stream = new MemoryStream();
                 CryptoStream m_cstream = new CryptoStream(m_stream, m_RC2Provider.CreateDecryptor(Encoding.Default.GetBytes(DecryptKey), m_btIV), CryptoStreamMode.Write);
                 m_cstream.Write(m_btDecryptString, 0, m_btDecryptString.Length);
                 m_cstream.FlushFinalBlock();
                 m_strDecrypt = Encoding.Default.GetString(m_stream.ToArray());
                 m_stream.Close(); m_stream.Dispose();
                 m_cstream.Close(); m_cstream.Dispose();
             }
             catch (IOException ex) { throw ex; }
            catch (CryptographicException ex) { throw ex; }
             catch (ArgumentException ex) { throw ex; }
             catch (Exception ex) { throw ex; }
            finally { m_RC2Provider.Clear(); }
             return m_strDecrypt;
         }
    
         /// <summary>
         /// 3DES 加密(基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高)
         /// </summary>
         /// <param name="EncryptString">待加密密文</param>
         /// <param name="EncryptKey1">密钥一</param>
         /// <param name="EncryptKey2">密钥二</param>
        /// <param name="EncryptKey3">密钥三</param>
         /// <returns>returns</returns>
         public static string DES3Encrypt(string EncryptString, string EncryptKey1, string EncryptKey2, string EncryptKey3)
         {
             string m_strEncrypt = "";
             try
             {
                 m_strEncrypt = DESEncrypt(EncryptString, EncryptKey3);
                 m_strEncrypt = DESEncrypt(m_strEncrypt, EncryptKey2);
                m_strEncrypt = DESEncrypt(m_strEncrypt, EncryptKey1);
             }
             catch (Exception ex) { throw ex; }
             return m_strEncrypt;
         }
    
         /// <summary>
         /// 3DES 解密(基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高)
         /// </summary>
         /// <param name="DecryptString">待解密密文</param>
         /// <param name="DecryptKey1">密钥一</param>
         /// <param name="DecryptKey2">密钥二</param>
         /// <param name="DecryptKey3">密钥三</param>
         /// <returns>returns</returns>
         public static string DES3Decrypt(string DecryptString, string DecryptKey1, string DecryptKey2, string DecryptKey3)
         {
             string m_strDecrypt = "";
             try
             {
                m_strDecrypt = DESDecrypt(DecryptString, DecryptKey1);
                 m_strDecrypt = DESDecrypt(m_strDecrypt, DecryptKey2);
                 m_strDecrypt = DESDecrypt(m_strDecrypt, DecryptKey3);
             }
             catch (Exception ex) { throw ex; }
             return m_strDecrypt;
         }
    
         /// <summary>
         /// AES 加密(高级加密标准,是下一代的加密算法标准,速度快,安全级别高,目前 AES 标准的一个实现是 Rijndael 算法)
         /// </summary>
         /// <param name="EncryptString">待加密密文</param>
         /// <param name="EncryptKey">加密密钥</param>
        /// <returns></returns>
        public static string AESEncrypt(string EncryptString, string EncryptKey)
         {
            if (string.IsNullOrEmpty(EncryptString)) { throw (new Exception("密文不得为空")); }
             if (string.IsNullOrEmpty(EncryptKey)) { throw (new Exception("密钥不得为空")); }
             string m_strEncrypt = "";
             byte[] m_btIV = Convert.FromBase64String("Rkb4jvUy/ye7Cd7k89QQgQ==");
             Rijndael m_AESProvider = Rijndael.Create();
             try
             {
                 byte[] m_btEncryptString = Encoding.Default.GetBytes(EncryptString);
                 MemoryStream m_stream = new MemoryStream();
                 CryptoStream m_csstream = new CryptoStream(m_stream, m_AESProvider.CreateEncryptor(Encoding.Default.GetBytes(EncryptKey), m_btIV), CryptoStreamMode.Write);
                 m_csstream.Write(m_btEncryptString, 0, m_btEncryptString.Length); m_csstream.FlushFinalBlock();
                 m_strEncrypt = Convert.ToBase64String(m_stream.ToArray());
                 m_stream.Close(); m_stream.Dispose();
                 m_csstream.Close(); m_csstream.Dispose();
             }
             catch (IOException ex) { throw ex; }
             catch (CryptographicException ex) { throw ex; }
             catch (ArgumentException ex) { throw ex; }
             catch (Exception ex) { throw ex; }
             finally { m_AESProvider.Clear(); }
             return m_strEncrypt;
         }
    
         /// <summary>
         /// AES 解密(高级加密标准,是下一代的加密算法标准,速度快,安全级别高,目前 AES 标准的一个实现是 Rijndael 算法)
         /// </summary>
         /// <param name="DecryptString">待解密密文</param>
         /// <param name="DecryptKey">解密密钥</param>
         /// <returns></returns>
         public static string AESDecrypt(string DecryptString, string DecryptKey)
         {
             if (string.IsNullOrEmpty(DecryptString)) { throw (new Exception("密文不得为空")); }
             if (string.IsNullOrEmpty(DecryptKey)) { throw (new Exception("密钥不得为空")); }
             string m_strDecrypt = "";
             byte[] m_btIV = Convert.FromBase64String("Rkb4jvUy/ye7Cd7k89QQgQ==");
             Rijndael m_AESProvider = Rijndael.Create();
             try
             {
                 byte[] m_btDecryptString = Convert.FromBase64String(DecryptString);
                 MemoryStream m_stream = new MemoryStream();
                 CryptoStream m_csstream = new CryptoStream(m_stream, m_AESProvider.CreateDecryptor(Encoding.Default.GetBytes(DecryptKey), m_btIV), CryptoStreamMode.Write);
                 m_csstream.Write(m_btDecryptString, 0, m_btDecryptString.Length); m_csstream.FlushFinalBlock();
                 m_strDecrypt = Encoding.Default.GetString(m_stream.ToArray());
                 m_stream.Close(); m_stream.Dispose();
                 m_csstream.Close(); m_csstream.Dispose();
             }
             catch (IOException ex) { throw ex; }
             catch (CryptographicException ex) { throw ex; }
             catch (ArgumentException ex) { throw ex; }
             catch (Exception ex) { throw ex; }
             finally { m_AESProvider.Clear(); }
             return m_strDecrypt;
         }

    复制代码

    2、数据加密和解密简单代码调用如下: 

    Response.Write("<br>-----------MD5加密---------------<br>");        

    Response.Write(SDKSecurity.MD5Encrypt("仰天一笑"));
    Response.Write("<br>-----------DES加密---------------<br>");        

    Response.Write(SDKSecurity.DESEncrypt("仰天一笑", "anson-xu"));        

    Response.Write("<br>-----------DES解密---------------<br>");        

    Response.Write(SDKSecurity.DESDecrypt("l06JvJ45r/lb9iKzSXl47Q==", "anson-xu"));
    Response.Write("<br>-----------AES加密---------------<br>");    

    Response.Write(SDKSecurity.AESEncrypt("仰天一笑", "ansonxuyu"));        

    Response.Write("<br>-----------AES解密---------------<br>");        

    Response.Write(SDKSecurity.AESDecrypt("avwKL+MO8+zoLHvzk0+TBA==", "ansonxuyu"));

    3、数据加密和解密调用后运行效果图如下: 

    为系统而生,为框架而死,为debug奋斗一辈子; 吃符号的亏,上大小写的当,最后死在需求上。

    展开全文
  • 数据加密方式(3类)

    千次阅读 2018-10-23 13:47:06
    链路加密方式:加密是逐跳进行的,此方式为在离开一个节点进入信道时加密,在离开信道通过节点时解密,因此数据在信道中呈现密文形式,在节点中呈现明文形式 节点到节点加密方式:不允许信息在节点中以明文形式存在...

    链路加密方式:加密是逐跳进行的,此方式为在离开一个节点进入信道时加密,在离开信道通过节点时解密,因此数据在信道中呈现密文形式,在节点中呈现明文形式

    节点到节点加密方式:不允许信息在节点中以明文形式存在,为了解决在节点中是明文的情况,在中间节点里装有加密解密的保护装置,在节点中完成一个密钥向另一个密钥转换的过程,即将数据进行解密和加密,在节点中有一个安全模块,在模块中采用另一个密钥进行数据的加密,加密过程是不可见的,解决了在节点中是明文的情况(节点加密要求报头和路由信息都是明文,以便中间节点能够得到如何处理信息的信息)

    端到端加密方式:在源端进行加密,在传输过程中不解密,一直到达目的端才进行解密。因此对于中继节点来说,用户数据是不可知的密文。

    展开全文
  • 数据加密技术是网络中最基本的安全技术,主要是通过对网络中传输的信息进行数据加密来保障其安全性,这是一种主动安全防御策略,用很小的代价即可为信息提供相当大的安全保护。 一、加密的基本概念  "加密",是...
  • 数据加密

    千次阅读 2019-12-13 19:45:20
    数据加密,是一门历史悠久的技术,指通过加密算法和加密密钥将明文转变为密文,而解密则是通过解密算法和解密密钥将密文恢复为明文。它的核心是密码学。       数据加密仍是计算机...
  • 数据加密常用算法介绍

    千次阅读 2019-04-03 17:05:34
    数据加密前言1.MD5加密2.RSA加密3.AES加密4. 3DES加密 前言 用户数据无论保存在SharePreferences,还是保存在SQLite数据库里,都有必要对关键数据进行加密。加密算法多种多样。常见的有MD5、RSA、AES、3DES。 1.MD5...
  • 一、加密术语 1、加密 透过数学公式运算,使文件或数据模糊化,将容易识别的明文变成不可识 别的密文 用于秘密通讯或安全存放文件及数据 2、解密 为加密的反运算 将已模糊化的文件或数据还原,由密文还原出明文 3、...
  • 数据传输加密

    千次阅读 2019-06-21 13:45:09
    加密技术是为了保护敏感数据在网络传输中的安全,就像日常生活中使用的淘宝、支付宝、微信等等软件,如果涉及到金额的数据在网络中不加密传输,那是极易被别人窃取、篡改的,通信中的数据加密技术就显得尤为重要。...
  • 数据脱敏和数据加密的区别

    万次阅读 2018-04-23 14:48:33
    数据脱敏和数据加密是两种截然不同的技术,适用于不同目的。 脱敏技术主要是为了兼顾数据安全与数据使用,采用的是专业的数据脱敏算法;而加密则是通过对数据进行编码来保护数据,检索原始值的唯一方法是使用解密...
  • 数据加密技术和数据加密算法

    千次阅读 2019-04-15 10:16:26
    数据加密技术 现代社会对信息安全的需求大部分可以通过密码技术来实现。密码技术是信息安全技术中的核心技术,它主要由密码编码技术和密码分析技术两个分支组成。密码编码技术的主要任务是寻求产生安全性高的有效...
  • 数据加密技术基本概念整理

    千次阅读 2012-06-07 11:38:44
    1.数据加密(Data Encryption)  指将一个信息(或称明文,plain text)经过加密钥匙(Encryption key)及加密函数转换,变成无意义的密文(cipher text),而接收方则将此密文经过解密函数、解密钥匙(Decryption...
  • 网络数据加密技术

    千次阅读 2006-11-27 17:18:00
    网络数据加密的三种技术在常规密码中,收信方和发信方使用相同的密钥,即加密密钥和解密密钥是相同或等价的。比较著名的常规密码算法有:美国的des及其各种变形,比如triple des、gdes、new des和des的前身lucifer;...
  • 过程:因为在所有中间部位的传递节点当中,消息全部被经过解密以后,再一次实施加密操作,所以,将路由信息涵盖在链路当中,全部的数据普遍使用秘闻的方式进行呈现。 作用:将链路把消息进行传递的过程中,将起始...
  • 数据加密原理详解

    千次阅读 2019-11-29 11:05:36
    数据加密,是一门历史悠久的技术,指通过加密算法和加密密钥将明文转变为密文,而解密则是通过解密...和防火墙配合使用的数据加密技术,是为提高信息系统和数据的安全性和保密性,防止秘密数据被外部破译而采用的主...
  • 常用的数据加密方式

    千次阅读 2016-09-17 10:52:13
    常用加密方式   Base64 Sha1(Secure Hash Algorithm) (非对称加密) Sha256(非对称加密) Sha512(非对称加密) MD5(Message Digest Algorithm 5)(非对称加密) RSA(非对称加密) DES(Data Encryption ...
  • SQL server 数据加密

    千次阅读 2019-08-18 09:53:31
    简介 加密是指通过使用密钥或...在SQL Server中,加密并不能替代其他的安全设置,可以当数据库破解或是备份被盗取后的最后一道防线,通过加密,未经授权的人在没有密匙或密码的情况下所窃取的数据变成毫无意义。 ...
  • MySQL数据加密与解密

    千次阅读 2019-06-29 16:11:45
    MySQL数据加密与解密 1.测试环境 MySQL 8.0 版本 .Net Framework 4.5.2 2.MySQL 自带的加密函数:aes_encrypt() 解密函数 aes_decrypt() 3.插入数据加密 INSERT INTO XXX VALUES(' aes_encrypt('加密的数据','...
  • 常用js数据加密

    万次阅读 2019-11-21 11:20:27
    常用js数据加密 原生js已经支持base64加密及解密 //加密 window.btoa(this.shop) //解密 window.atob(this.shop)
  • 数据安全加密技术分析

    千次阅读 2017-11-23 14:57:05
    当然在这技术革新的烘炉中,数据安全已经达到了必不可缺的地步。传统的数据安全系统,基本上就是利用防火墙或者病毒防护,再者就是做好入侵检测工作,而这些都已远远不能满足用户的安全需求。 2017年5月12日勒索...
  • 加密技术在企业数据安全中的应用随着大型企业管理软件的发展,其应用越来越广泛,企业数据平台涉及局域网、广域网、Internet等,在各类系统中保存的企业关键数据量也越来越大,许多数据需要保存数十年以上,甚至是...
  • 软考总结--数据加密与认证技术

    千次阅读 热门讨论 2016-11-03 12:44:59
    可采用多种技术数据加密,并制定相应的数据安全机制,建立安全存储体系,包括容量、容错数据保护和数据备份等;建立事故应急计划和容灾措施;制定数据安全管理规范。   (2)外部因素。可将数据分成不同的密级...
  • Oracle 透明数据加密TDE

    千次阅读 2015-05-25 15:35:09
    透明数据加密TDE   这可能是你的公司最恐怖的噩梦:有人偷走了数据库的备份磁带!当然,你可能构造了一个安全的系统,加密了最敏感的资产,然后围绕数据库服务器建了一圈防火墙来保护。但是,小偷却采取了最简单的...
  • 数据传输加密技术

    千次阅读 2013-05-27 22:33:54
    数据传输加密技术 目的是对传输中的数据流加密, 常用的方针有线路加密和端对端加密两种。前者侧重 在线路上而不考虑信源与信宿, 是对保密信息通过各线路采用不同的加密密钥提供安全 保护。后者则指信息由发送者...
  • Oracle10G:透明数据加密技术(TDE)

    千次阅读 2013-02-17 20:04:53
    在Oracle的最新版本10g R2中,出现最及时的技术应该是透明数据加密技术(Transparent Data Encryption,TDE)。 TDE用来对数据加密,通常 SQL 执行的应用程序逻辑不需要进行更改,仍能正常运行。 换言之,应用程序...
  • POST数据加密

    万次阅读 2015-07-28 15:47:21
    数据加密: GET请求和POST请求其中之一的区别:GET请求参数直接加在请求路径后面,很不安全; 所以一定要使用POST请求提交用户的隐私数据 1,GET请求的所有参数都是直接暴露在URL中 2,请求的URL...
  • 常用数据加密算法

    千次阅读 2019-01-10 14:34:46
    假设两个用户需要使用对称加密方法加密然后交换数据,则用户最少需要2个密钥并交换使用,如果企业内用户有n个,则整个企业共需要n×(n-1) 个密钥,密钥的生成和分发将成为企业信息部门的恶梦。 对称加密算法的安全性...
  • oracle透明数据加密技术(TDE)

    千次阅读 2011-08-19 15:47:53
    在网上看到这篇加密的文章(http://www.examda.com/oracle/zhonghe/20080629/104051565.html),在机器上操作了一下,虽然数据列被成功的加密了,但是还是有很多疑问,下面把操作步骤记下,把自己的疑问也在这里提...
  • C语言编程之数据加密

    2019-03-15 10:33:42
    问题描述:某公司采用内部公用电话来传递数据数据是四位的整数,在传递过程中是加密的,加密规则如下: 每位数字都加上5,然后用和除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换。 程序...
  • java 数据加密基本知识

    千次阅读 2019-01-21 15:20:44
    BASE64的加密解密是双向的,可以求反解. BASE64Encoder和BASE64Decoder是非官方JDK实现类。虽然可以在JDK里能找到并使用,但是在API里查不到。 JRE 中 sun 和 com.sun 开头包的类都是未被文档化的,他们属于 java, ...

空空如也

1 2 3 4 5 ... 20
收藏数 578,924
精华内容 231,569
关键字:

数据加密