加解密简介

本文介绍了电子商务中的加密技术,包括对称加密与非对称加密,并详细解析了使用微软CryptoAPI进行DES加密的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    加密技术,签名技术的需要做到三防一确认。一防窃听,二防篡改,三防抵赖,确认对方身份。

    在电子商务过程中,开始时必须确认对方身份,不然谈了半天,发现互联网那头真是一条狗,就悲剧了。

    防窃听是指,即便有人在网络传输过程中得到了数据,看到的也是乱七八糟,无法从中得知正常的信息。举个例子,谈判前老总通过网络跟你商定了底价,不巧对方抓取到了此信息,如果没有合适的加密手段,他可能就据此在谈判中占尽上风。所以防窃听是很重要的。

   放篡改,即保证对方和自己说的话,原封不动的传达到位。买200克黄金不能变成买20克。

   放抵赖,现代商情瞬息万变,电子商务要求不能否认已达成的交易。比如早上商定要进货1吨,下午眼看价格降了,想抵赖,必须有方法让其不得否认。

 

   技术基础一:对称加密和非对称加密。这方面的资料很多,相对也复杂,这里只简单介绍。对称加密,简单说是加密时用一个密匙,解密时用同一个密匙。非对称加密,加密时用一个密匙(称作私匙),解密用另一个密匙(称作公匙)。对称加密算法一般有DES,3DES,SHA,RC2,AES。非对称加密算法有RSA等。防窃听主要是通过加密技术实现的。另外非对称加密相对对称加密要慢很多。

 

   技术基础二:签名。对整个消息做摘要(如MD5等),并对摘要用私匙加密,得到的就是签名。签名技术主要用于保证放篡改、放抵赖和身份确认。

 

   目前业界通用的两套加解密库有开源的openssl和微软系统自带的CryptoAPI。本文简单介绍下CryptoAPI的用法,想来openssl大同小异。例子是最好的教材,let's go。

 

   DES加密的例子。

   1.CryptAcquireContext() // 取得CSP(Crypt service provider),即真正的加密算法库。微软CryptoAPI是对各种算法,如加密、摘要、签名、DES、AES等的封装,为程序员提供统一接口。当对性能或安全性(算法的具体实现有时也会影响最终安全效果)有特殊要求时,可以另外提供硬件或软件加密算法库。

      参数表:

      pszContainer // 存放密匙的容器。一般是NULL,即存在默认地方。

      pszProvider   // 一般是MS_STRONG_PROV,微软提供的算法库之一

      dwFlags        // 可以用CRYPT_SILENT,如果不用私匙的话,加上此标记将不出现交互界面

 

   2.CryptCreateHash()  // 创建一个Hash对象,这是CryptoAPI比较烦的一个地方,如果有密匙"123456",不能直接用,必须放到一个hash对象里,再从hash对象导出到HCRYPTKEY(CryptoAPI密匙句柄)。而且此时导出的密匙实际上"123456"做过摘要之后的值。比如创建HASH对象时选择MD5算法,密匙就是MD5("123456")。

      参数表:

      ALG_ID // 摘要算法,一般是CALG_MD5

      hKey     // 一般是NULL,用HMAC或MAC时可传入此值。HMAC和MAC本文不详述。

 

   3.CryptHashData() // 没有太多需要解释的,把密匙放入hash对象

 

   4.CryptDeriveKey() // 从Hash对象中导出真正使用的密匙。

      参数表:

     ALG_ID    // 加密算法,可以是CALG_DES、CALG_RC2等,详见MSDN。

     dwFlags   // 这个重要,很容易搞错。是DWORD值,高16位表示要导出多少位的密匙,DES加密需要64位密匙,就是0x00400000。每种算法需要多少位密匙一定不能搞错,否则函数失败,GetLastError提示参数不正确。低16位,是一些标志位。其中CRYPT_NO_SALT非常重要,如果不选择此标志,导出密匙时将附加不定位的盐(取决于要导出多少位),加密时也将使用该盐。如果解密时不用同样的盐,解密会失败。对于DES加密,我建议选择CRYPT_NO_SALT,这样与算法流程更贴合,与其他平台交互时也没有不必要的麻烦。

 

   5.CryptSetKeyParam() // 这个函数是可选的,可以用它设置一些参数。比如IV(初始化向量),加密模式,不设的话,IV默认均为空,模式默认为CBC。

 

   6.CryptEncrypt() // 真正的加密函数。一般调用两次,第一次确定密文长度,根据此值分配空间后,第二次做真正的加密,得到密文。

 

   7.CryptReleaseContext, CryptDestroyKey, CryptDestoryHash。做C/C++的同志们对这个应该不陌生吧。记得次序问题,翻过来调用。

 

   解密的例子:

   加密时的CryptEncrypt换成CryptDecrypt。没有太多好解释的。

 

 

   另外几个需要注意的地方:

   1.CryptSetKeyParam,设置CBC和ECB模式是有效的,虽然从CryptGetKeyParam得到的结果一律是0.

   2.CryptGetHashParam取HashValue时,必须调用两次,否则无论你传进去的缓冲区有多大,一律失败,还会告诉你“有更多缓冲区可用”

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值