STM32开发RSA算法,递归消耗栈空间结果

更新一篇简书    STM32开发RSA算法实验过程,同时可以估算RSA算法在MCU上开发的可行性问题研究

        开篇文章像写论文一样,RSA算法在ARM上开发,由于算法计算量很大,常用C语言开发的RSA算法大多用递归调用的方式,如果单纯的硬计算的话就不要考虑ARM芯片了,因为通过计算太耗时,这个时间是做项目不能接受的。而大多数递归算法处理的调用简单的说也是比较消耗资源,递归函数调用之所以消耗资源是因为函数堆栈的原因,递归不断调用函数本身,而一个函数在开始执行的时候是要先入栈,首先是形参入栈,然后是函数入栈,由于递归调用,函数是没有退出的,相当于函数没有退栈处理,这样的话每次递归调用一次函数就消耗一部分栈空间,最后栈空间被大量消耗,对于单片机而言导致资源不够。这也是为什么在很多资源不是特别多的情况下我们尽量比较少的考虑递归的使用,但是递归的使用确实能减少大量计算量并使程序简单易懂。

       1.了解RSA算法原理,利用两个大素数乘积成为一个更巨大的数,很难被分解出质因数的特性来进行加密解密处理。传输过程中将公钥对发送给加密方,私钥对自己保存,然后加密方通过公钥对  对文件进行加密,通过各种传输到自己这边,自己利用手中的私钥对进行解密,由于其余的人不知道私钥对,即便他们在网络上截获了你的公钥对,也截获了你的加密文件,但是没有私钥对,依然无法解密,这也是非对称加密的原理。

公钥和私钥


 RSA算法原理以及相关例子介绍,推荐参考博客:https://www.cnblogs.com/jiftle/p/7903762.html

      2.针对算法有部分了解后,查看算法实现,整理几个C语言算法实现:https://blog.csdn.net/haroroda/article/details/46336053,百度上都是基本的伪代码,不过针对这种代码可以了解一下实现原理,但是这种算法应用相对来说不好;在github 上有很多关于C语言实现RSA算法:https://github.com/KONGDejing/kongdejing.rsa

      3.支持开源项目:关于github,在我前面一篇简书中曾经提到过,针对github一点点想法; 浏览github是一件很有趣的事情。

圆明园

      4.在STM32F407开发板上验证算法可行性,首先将算法在linux上进行验证,然后移植到开发板上,STM32F407开发板默认的栈空间大小是0x00000400,堆空间是0x00000200;实际上STM32内存大小有192K+4Kk扩展空间,验证过程中会发现,不同的位数质数相乘,会造成堆栈空间不够从而让算法无法正常运行,在默认的堆栈空间下,我自测发现只能实现低3位质数相乘的大素数作为module,修改堆栈大小能够有效增加运算的数据量。在目前MCU上开发,数据大小最长是8个字节的数据,相当于二进制2的64位数据,相当于十进制的数据的19位左右,对于1024位数据在mcu上是无法直接通过数据类型存储的,这样又需要做如何存储这种大数据,但是这里我们不讲如此大的数据存储,对于大多数应用场合其实经过RSA加密后也是难以破解的,而对于long long 型数据我们质数就有一定的限制,大小接近10亿数量级。RSA在大小接近10亿数量级乘积获得module,这样就有如何产生10亿左右大小素数的算法,相对这个算法实现10亿大小的数据是完全有可能的,但是RSA算法其实只需要知道两个大质数和公钥私钥就行,对于产品开发完全可以用内置的素数进行,不需要通过MCU自行生成。可以通过linux针对一部分算法进行验证,生成两个10亿级大素数,然后通过RSA算法进行计算,目前来说大素数随机生成方法是不存在的,这是一个NPC问题NPC问题世界的七大难题之一,Miller-Rabin算法主要用途是检验一个大数是否是素数,但是无法随机产生一个大素数。java中有BigInterger概念,是可以生成1024bit数量级的大素数。针对C语言应用来说,用到longlong的8个字节64bit数据就可以了。

长江行水

5.生成10亿数量级的大素数需要的时间也是比较长的,针对C语言而言,要找出10亿数量级的大素数耗时也是非常夸张的,博客:https://blog.csdn.net/huang_miao_xin/article/details/51331710即便是高效一点的算法,在1000W大小的数据内找到所有的素数,运行环境,CPU-i5-3210,内存4G,win7,vs2012时间消耗是2.5S ,10亿级数据远大于250S,因为越到后面,每个数据越来越大,每次判断耗时越来越大,所以增加耗时时间甚至几小时。所以不建议直接通过C语言来找两个大素数,通过java来生成两个比较大的素数还是比较容易的。直接利用java生成的素数内置到设备端。

水木清华

6.利用生成的素数进行RSA算法处理,在STM32中根据两个素数和公钥生成私钥,然后将公钥发送给加密方对重要信息加密,解密方对传输过来的文件进行解密。这里面还有一个问题,如果素数越大的话,会导致加密文件越大,因为任何一个字符加密后的数据和素数的数据类型是一致的,如果一开始素数是int型数据,加密后每个字符数据变成Int大小,加密文件相当于扩大4倍,对于longlong型素数,加密文件相当于扩大8倍。在工程应用,产品开发过程中需要结合能容忍的范围,因为加密问价加大的话,传输时间相对来说增加不止一点半点,也是成倍增加。能够直观感受到MCU跑的不容易。

7.  结束语,找到学习方法,勇往直前,我始终相信任何工程项目只要想去做都是能够实现的。热爱一个事情

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,001评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,210评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,874评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,001评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,022评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,005评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,929评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,742评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,193评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,427评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,583评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,305评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,911评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,564评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,731评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,581评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,478评论 2 352

推荐阅读更多精彩内容