ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 2173|回复: 3

[原创] 利用“RSA公开密钥密码体制”加密发送和解密“拟完美序列”的模拟

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-8-11 18:23 | 显示全部楼层 |阅读模式
我的前帖:

密码学小应用:利用线性反馈移位寄存器生成周期性序列
http://club.excelhome.net/thread-1492936-1-1.html
(出处: ExcelHome技术论坛)


可以模拟生成“拟完美序列(伪随机序列)”,长度可以很大,作为对明文加密的密钥。

然而,这个由“拟完美序列”构成的密钥虽然生成快捷简便,但是窃密者利用同样的“初值序列”和“系数序列”也可以生成一模一样的密钥,伪装(加密)传递“初值序列、系数序列”和伪装传递“拟完美序列”本身等价,反倒省了信息接收者“再次生成”的麻烦。

关于“拟完美序列”的加密发送和解密,可以利用“RSA公开密钥密码体制”,完美解决。

这个我不做过多介绍,本帖附件正是模拟了这一过程。最终的感慨:难啊……大数的处理,不是我这等水平可以办到的,一不小心就“溢出”,就是选小一些的数,也很难成功啊……

大致思路是这样的:
1.将拟完美序列转换成十进制数,Excel有效精度最大转36位啊,超过这个就变成“科学记数法”了,我创立了“分段加解密”,结果每段段前的若干个0在加解密的过程中会丢失,造成错误。同理,实际应用当中的拟完美序列估计也会要求首位是1吧,呵呵,这是我无能的猜测,这个转换后的数就记作:x,方便下文叙述。

2.一般的RSA中,信息接收者会生成一对密钥(a,b),a公开,叫公钥;b隐秘,叫私钥。信息发送者使用信息接收者提供的公钥a对信息加密发送,只有私钥b可以解密,别人截获是徒劳的。加强版的RSA中有两对密钥(a1,b1)、(a2,b2),1由信息发送者A生成,2由信息接收者B生成。一般是:A用a2对信息加密,用b1对信息签名;B用b2对信息解密,用a1对信息验证签名。这样在防止窃秘的基础上,还防止了别人利用公钥发假消息,这个机制不得不说:牛!牛牛!!牛牛牛!!!本文只对一般的RSA进行小体量的模拟,只供学习用途。

3.RSA的安全性基于这样一个事实:
由两个素数(p,q)乘出一个积(N)很容易(当然,超大结果我也不会算……),但由一个超大数比如长度500位(N),呵呵,反过来分解出这两个素数,是极端困难的。
由此我们也可以想到,密码的安全性是有时效的,随着计算能力的发展,10年前的密码可能现在破解起来很轻松,因此,加解密和破译总是互相推进的,这个由素数对(p,q)生成的超大数(N)估计会越来越大。

4.一般的RSA的具体实现步骤如下:
*确保:N>x,我的附件中不能保证这一点,太大就“溢出”了,尤其在“幂模运算”时,可以针对长度7位、15位左右的拟完美序列转换成的x进行模拟;
*N=pq,p≠q,N公开,(p,q)严格保密;
*计算φ(N)=(p-1)(q-1),并严格保密;
*确定公钥对(N,a)中的a,a需满足条件:(a,N)=1、(a,φ(N))=1、1<a<φ(N),这个试起来很费劲,慢慢找吧;
*根据(φ(N),a)计算 出私钥对(N,b)中的b,并严格保密,计算关系如下:ab≡1(mod φ(N)),呵呵,发明并证明这些的“*家”们头脑真不是盖的;
*加密过程:模N运算,x一横^a=y一横;
*解密过程:模N运算,y一横^b=x一横。

5.实际的情况中,由于大数N的使用完全可以满足任意长度的拟完美序列,并不需要对拟完美序列进行分段处理,我的附件中的分段处理只是我的“美好想像”,会造成信息失真,也有可能是我没找到更好的“分段处理方法”。

上个图,附件没多大用,只是一些好奇心而已,算是学习吧。
图3.jpg

附件如下:

3.拟完美序列的加密发送和解密的RSA模拟.zip (38.28 KB, 下载次数: 72)

哈哈。

点评

你消失很久了,闭关去了吗?再出手就不是不简单了  发表于 2019-8-11 19:26

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-8-11 18:33 | 显示全部楼层
有用的其实是两个自定义函数,拿出来得瑟一下,其实前辈们早都做出n遍了。

1.n进制转十进制(n进制数s$,进制n1∈[1,16]默认2),支持小数、负数。共2个参数。


  1. Public Function NToD#(s$, Optional n1% = 2) 'n进制转十进制(n进制数s$,进制n1∈[1,16]默认2),支持小数、负数
  2.     Dim k&, i&, ii%, z#, c$, j&, pd As Boolean
  3.     If n1 <= 0 Then NToD = 1 / 0: Exit Function
  4.     pd = False
  5.     j = -1
  6.     If InStr(1, s, ".") Then k = InStr(1, s, ".") - 1 Else k = Len(s) '处理小数
  7.     If Asc(Mid(s, 1, 1)) = 45 Then ii = 2 Else ii = 1 '处理负数
  8.     For i = ii To Len(s)
  9.         c = Mid(s, i, 1)
  10.         If Not (Asc(c) >= 48 And Asc(c) <= 57) Then
  11.             c = UCase(c)
  12.             If Asc(c) > 54 + n1 Then NToD = 1 / 0: Exit Function '排除超限英文字母字符及超限非法字符
  13.             If Asc(c) = 65 Then 'A
  14.                 c = "10"
  15.             ElseIf Asc(c) = 66 Then 'B
  16.                 c = "11"
  17.             ElseIf Asc(c) = 67 Then 'C
  18.                 c = "12"
  19.             ElseIf Asc(c) = 68 Then 'D
  20.                 c = "13"
  21.             ElseIf Asc(c) = 69 Then 'E
  22.                 c = "14"
  23.             ElseIf Asc(c) = 70 Then 'F
  24.                 c = "15"
  25.             ElseIf Asc(c) = 46 Then '.
  26.                 pd = True
  27.             Else '排除Asc(c)<65的除“0123456789.”外的非法字符
  28.                 NToD = 1 / 0
  29.                 Exit Function
  30.             End If
  31.         ElseIf Asc(c) > 47 + n1 Then '排除超限阿拉伯数字字符
  32.             NToD = 1 / 0
  33.             Exit Function
  34.         End If
  35.         If pd Then
  36.             j = j + 1
  37.             z = z + Val(c) * n1 ^ (-j)
  38.         Else
  39.             z = z + Val(c) * n1 ^ (k - i)
  40.         End If
  41.     Next i
  42.     If ii = 2 Then NToD = -1 * z Else NToD = z
  43. End Function
复制代码



2.十进制转n进制(十进制数x,进制n1∈[1,16]默认2,输出小数部分精度位数ws),支持小数、负数。共3个参数。

  1. Public Function DToN$(x#, Optional n1% = 2, Optional ws% = 4) '十进制转n进制(十进制数x,进制n1∈[1,16]默认2,输出小数部分精度位数ws),支持小数、负数
  2.     Dim x1#, x2#, r%, i%, r1#, z$, szf, pd As Boolean, pd1 As Boolean
  3.     If n1 < 1 Or ws < 1 Then
  4.         DToN = 1 / 0: Exit Function
  5.     ElseIf n1 = 1 Then
  6.         DToN = 0: Exit Function
  7.     End If
  8.     szf = Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F")
  9.     If x < 0 Then pd = True: x = Abs(x) '处理负数
  10.     If x <> Int(x) Then x2 = x - Int(x): x = Int(x): pd1 = True
  11.     Do '处理整数部分
  12.         r = x Mod n1
  13.         z = szf(r) & z
  14.         x1 = (x - r) / n1
  15.         x = x1
  16.     Loop Until x = 0
  17.     If pd1 Then '处理小数部分
  18.         z = z & "."
  19.         For i = 1 To ws
  20.             r1 = x2 * n1
  21.             z = z & szf(Int(r1))
  22.             x2 = r1 - Int(r1)
  23.             If x2 = 0 Then Exit For
  24.         Next i
  25.     End If
  26.     If pd Then DToN = "-" & z Else DToN = z
  27. End Function
复制代码


在“十转n”中曾考虑:“前置补0,统一位数长度输出”,比如输出5位长度时是00011,而不是11。后来又放弃了,转而处理小数了,呵呵,小数部分处理起来有点麻烦,目前最后一位采取简单的“截断”办法,而不是根据下一位和进制n判断所谓“四舍五入”(需调整到相应n进制下)。

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2019-8-11 22:53 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
感谢分享!!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-26 12:08 , Processed in 0.043895 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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