游戏开发论坛

 找回密码
 立即注册
搜索
查看: 8930|回复: 5

原创:使用cryptopp实现密钥协商

[复制链接]

11

主题

190

帖子

255

积分

中级会员

Rank: 3Rank: 3

积分
255
发表于 2008-10-18 12:30:00 | 显示全部楼层 |阅读模式
  所谓“密钥协商”,就是指使用加密协议通信的双方,在通讯之前如何约定一个共同的密码的问题。
    例如网络游戏中的消息一般都是使用对称加密算法加密的,比如DES或者BlowFish等,这些对称算法的加密密码和解密密码是一样的,也就是说,如果黑客知道密码的话,就能通过拦截消息包解密出玩家的账号密码等信息。所以使用对称加密算法的通讯双方在通讯前需要约定一个动态的密钥,而且这个密钥不能被监听者得到,这就是“密钥协商”协议。
    密钥协商协议的关键就是利用“不可逆”算法,举个简单例子:

    A和B分别住在两个帐篷里,他们之间的通讯大家都能看得到,现在他们想共同约定出一种颜色,而且不被别人知道,应该怎么办呢?
   
    方法如下:
    .A和B首先约定好公开的一种颜色,比如红色
    .A挑选出一种私密的颜色,比如蓝色,然后和红色混合起来
    .B挑选出一种私密的颜色,比如黄色,然后也和红色混合起来
    .A和B互相交换混合后的颜色
    .A把得到的颜色中加入自己选中的蓝色
    .B把得到的颜色中加入自己选中的黄色
    .现在A和B手里的颜色都是"红+蓝+黄",也就是说,A和B已经约定好了共同的颜色,而帐篷外的人却无法得知

    秘密就在于,把两种颜色混合在一起是一种“不可逆”的过程,起码很难。目前常用的加密协议中的不可逆算法都是这样,并不是理论上不可逆,而是很困难,困难到以目前的计算条件,算上几万年才能算出来,我们也就认为这种算法是安全的。比如两个大素数的相乘是很容易计算的,但把相乘的结果分解则是非常困难的,很多不对称加密算法都是利用大素数的相乘来进行的。
    在加密通讯前进行密钥协商的原理和上面的例子流程差不多,当然,已经有很多很好的算法和开源库可以利用,相对来说,cryptopp比起openssl更轻便一些,windows下使用也比较方便。
   
    Cryptopp的官方网站是http://www.cryptppp.com,不知道为什么,国内近期已经无法访问了,还好在SourceForge上也有cryptopp的影像,大家可以从这里下载(http://sourceforge.net/projects/cryptopp/)。

   目前的Cryptopp5.5.2提供了VS2005的sln文件,在Windows下可以直接编译使用,下面是利用其中的Diffie-Hellmar协议进行密钥协商的示例代码:

  1. [color=#000080]using[/color] [color=#000080]namespace[/color] CryptoPP;

  2. [color=#008800]//////////////////////////////////////////////////////////////////////////[/color]
  3. [color=#008800]// Alice[/color]

  4. [color=#008800]// Initialize the Diffie-Hellman class with a random prime and base[/color]
  5. AutoSeededRandomPool arngA;
  6. RandomNumberGenerator& rngA = *[color=#000080]dynamic_cast[/color]<RandomNumberGenerator *>(&arngA);
  7. DH dhA(rngA, [color=#0000ff]128[/color]);

  8. [color=#008800]// Extract the prime and base. These values could also have been hardcoded [/color]
  9. [color=#008800]// in the application[/color]
  10. Integer iPrime = dhA.GetGroupParameters().GetModulus();
  11. Integer iGenerator = dhA.GetGroupParameters().GetSubgroupGenerator();

  12. SecByteBlock privA(dhA.PrivateKeyLength());
  13. SecByteBlock pubA(dhA.PublicKeyLength());
  14. SecByteBlock secretKeyA(dhA.AgreedValueLength());

  15. [color=#008800]// Generate a pair of integers for Alice. The public integer is forwarded to Bob.[/color]
  16. dhA.GenerateKeyPair(rngA, privA, pubA);


  17. [color=#008800]//////////////////////////////////////////////////////////////////////////[/color]
  18. [color=#008800]// Bob[/color]

  19. AutoSeededRandomPool arngB;
  20. RandomNumberGenerator& rngB = *[color=#000080]dynamic_cast[/color]<RandomNumberGenerator *>(&arngB);
  21. [color=#008800]// Initialize the Diffie-Hellman class with the prime and base that Alice generated.[/color]
  22. DH dhB(iPrime, iGenerator);

  23. SecByteBlock privB(dhB.PrivateKeyLength());
  24. SecByteBlock pubB(dhB.PublicKeyLength());
  25. SecByteBlock secretKeyB(dhB.AgreedValueLength());

  26. [color=#008800]// Generate a pair of integers for Bob. The public integer is forwarded to Alice.[/color]
  27. dhB.GenerateKeyPair(rngB, privB, pubB);



  28. [color=#008800]//////////////////////////////////////////////////////////////////////////[/color]
  29. [color=#008800]// Agreement[/color]

  30. [color=#008800]// Alice calculates the secret key based on her private integer as well as the[/color]
  31. [color=#008800]// public integer she received from Bob.[/color]
  32. [color=#000080]if[/color] (!dhA.Agree(secretKeyA, privA, pubB))
  33.   [color=#000080]return[/color] [color=#000080]false[/color];

  34. [color=#008800]// Bob calculates the secret key based on his private integer as well as the[/color]
  35. [color=#008800]// public integer he received from Alice.[/color]
  36. [color=#000080]if[/color] (!dhB.Agree(secretKeyB, privB, pubA))
  37.   [color=#000080]return[/color] [color=#000080]false[/color];

  38. [color=#008800]// Just a validation check. Did Alice and Bob agree on the same secret key?[/color]
  39. [color=#000080]if[/color] (memcmp(secretKeyA.begin(), secretKeyB.begin(), dhA.AgreedValueLength()))
  40.   [color=#000080]return[/color] [color=#000080]false[/color];

  41. [color=#008800]//////////////////////////////////////////////////////////////////////////[/color]
  42. [color=#008800]// Building on the previous example. Note that the example uses in-place encryption and  [/color]
  43. [color=#008800]// decryption where the input and output buffers are identical[/color]
  44. [color=#000080]int[/color] aesKeyLength = SHA256::DIGESTSIZE; [color=#008800]// 32 bytes = 256 bit key[/color]
  45. [color=#000080]int[/color] defBlockSize = AES::BLOCKSIZE;

  46. [color=#008800]// Calculate a SHA-256 hash over the Diffie-Hellman session key[/color]
  47. SecByteBlock key(SHA256::DIGESTSIZE);
  48. SHA256().CalculateDigest(key, secretKeyA, secretKeyA.size());

  49. [color=#008800]// Generate a random IV[/color]
  50. byte iv[AES::BLOCKSIZE];
  51. arngA.GenerateBlock(iv, AES::BLOCKSIZE);

  52. [color=#000080]char[/color] message[] = [color=#0000ff]"Hello! How are you."[/color];
  53. [color=#000080]int[/color] messageLen = ([color=#000080]int[/color])strlen(message) + [color=#0000ff]1[/color];


  54. [color=#008800]//////////////////////////////////////////////////////////////////////////[/color]
  55. [color=#008800]// Encrypt[/color]

  56. CFB_Mode<AES>::Encryption cfbEncryption(key, aesKeyLength, iv);
  57. cfbEncryption.ProcessData((byte*)message, (byte*)message, messageLen);

  58. [color=#008800]//////////////////////////////////////////////////////////////////////////[/color]
  59. [color=#008800]// Decrypt[/color]

  60. CFB_Mode<AES>::Decryption cfbDecryption(key, aesKeyLength, iv);
  61. cfbDecryption.ProcessData((byte*)message, (byte*)message, messageLen);

复制代码

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
发表于 2008-10-18 13:38:00 | 显示全部楼层

Re:原创:使用cryptopp实现密钥协商

很有价值,笑纳了

1367

主题

1993

帖子

2118

积分

金牌会员

Rank: 6Rank: 6

积分
2118
发表于 2008-10-20 16:45:00 | 显示全部楼层

Re:原创:使用cryptopp实现密钥协商

有价值
up

0

主题

13

帖子

15

积分

新手上路

Rank: 1

积分
15
发表于 2008-11-7 15:59:00 | 显示全部楼层

Re:原创:使用cryptopp实现密钥协商

不错~~~

12

主题

35

帖子

61

积分

注册会员

Rank: 2

积分
61
发表于 2008-11-15 20:46:00 | 显示全部楼层

Re:原创:使用cryptopp实现密钥协商

  方法如下:
    .A和B首先约定好公开的一种颜色,比如红色
    .A挑选出一种私密的颜色,比如蓝色,然后和红色混合起来
    .B挑选出一种私密的颜色,比如黄色,然后也和红色混合起来
    .A和B互相交换混合后的颜色
    .A把得到的颜色中加入自己选中的蓝色
    .B把得到的颜色中加入自己选中的黄色
    .现在A和B手里的颜色都是"红+蓝+黄",也就是说,A和B已经约定好了共同的颜色,而帐篷外的人却无法得知

-------假如公开颜色红色被小黑获取了。

A的私密颜色,不知道。但是红和蓝混合的颜色。可能会被小黑获取。这样就可以得出A的私密颜色
同样,B的私密颜色也可以得知。我不知道是我想的有问题还是什么。反正我总觉得不是那么完整

11

主题

190

帖子

255

积分

中级会员

Rank: 3Rank: 3

积分
255
 楼主| 发表于 2008-12-23 16:32:00 | 显示全部楼层

Re:原创:使用cryptopp实现密钥协商

这里假设的是,颜色混合是一种“不可逆”的算法,也就是说,虽然我们知道两种颜色混合后的颜色以及其中一种颜色,也很难猜到另外一种颜色,当然,这种“不可逆”不是绝对的,只是难度比较大而已。
应用的算法里不可逆算法也是这样,一般都用大质数的乘法作为不可逆算法,因为大数分解是非常困难的

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-20 15:34

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表