先参考这篇文章

  Linux实现树莓派3B的国密SM9算法交叉编译——(一)环境部署、简单测试与eclipse工程项目测试

  部署好环境,并简单测试交叉编译环境是否安装成功,最后实现在Eclipse上进行交叉编译。

  这篇文章主要介绍在Eclipse上进行miracl的交叉编译测试与生成miracl静态库,方便后续实现国密SM9算法。

一、MIRACL库介绍

  MIRACL(Multiprecision Integer and RationalArithmetic C/c++ Library)是一套由Shamus Software Ltd.所开发的一套关于大数运算函数库,用来设计与大数运算相关的密码学之应用,包含了RSA 公开密码学、Diffie-Hellman密钥交换(Key Exchange)、AES、DSA数字签名,还包含了较新的椭圆曲线密码学(Elliptic CurveCryptography)等等。运算速度快,并提供源代码。

  MIRACL用户手册(译):https://wenku.baidu.com/view/d542f2ed0975f46527d3e1dc.html

  由于毕业论文涉及到国密SM9算法,所以需要在树莓派中实现该SM9,查阅相关资料,有大神已经在windows平台上用miracl库实现了(https://blog.csdn.net/yaoyuanyylyy/article/details/80871509),然后自己同样在windows平台部署成功,但是需要和树莓派做秘钥协商,因此经过大量尝试,最后找到一个可行的方法,由于树莓派使用的是ARM处理器,所以需要通过交叉编译部署我们的国密算法。

二、MIRACL下载并在Kali上进行编译以及pk-demo测试

1、 从https://github.com/miracl/MIRACL/archive/master.zip下载github下的项目源码。我下载的是.zip压缩包,名字为MIRACL-master.zip。

2、 建立一个目录miracl用来放置源码

cd /root
mkdir miracl

3、 将下载成功的MIRACL-mater.zip放到上述创建的miracl目录

cd miracl
cp ../MIRACL-master.zip ./MIRACL-master.zip

4、 解压zip包,把所有独立的文件都放在这个目录,即将所有非目录的文件解压在当前目录下

unzip -j -aa -L MIRACL-master.zip
rm MIRACL-master.zip

5、 用shell文件编译。如果是64位系统用linux64,如果是32位系统用linux。由于我的系统为64位Kali Linux,因此执行如下命令

bash linux64

如果提示没有安装g++,请使用  sudo apt-get install g++ 进行安装。

6、 运行源码提供的示例代码 pk-demo,测试一下是否编译成功。

./pk-demo

这个程序是个简单检验,迪菲-赫尔曼密钥交换(Diffie–Hellman key exchange)协议的正确性,如果输出无错误则表示编译完成 ,

编译完成并成功运行!

linux64编译代码如下:

rm *.exe
rm miracl.a
cp mirdef.h64 mirdef.h
gcc -c -m64 -O2 mrcore.c
gcc -c -m64 -O2 mrarth0.c
gcc -c -m64 -O2 mrarth1.c
gcc -c -m64 -O2 mrarth2.c
gcc -c -m64 -O2 mralloc.c
gcc -c -m64 -O2 mrsmall.c
gcc -c -m64 -O2 mrio1.c
gcc -c -m64 -O2 mrio2.c
gcc -c -m64 -O2 mrgcd.c
gcc -c -m64 -O2 mrjack.c
gcc -c -m64 -O2 mrxgcd.c
gcc -c -m64 -O2 mrarth3.c
gcc -c -m64 -O2 mrbits.c
gcc -c -m64 -O2 mrrand.c
gcc -c -m64 -O2 mrprime.c
gcc -c -m64 -O2 mrcrt.c
gcc -c -m64 -O2 mrscrt.c
gcc -c -m64 -O2 mrmonty.c
gcc -c -m64 -O2 mrpower.c
gcc -c -m64 -O2 mrsroot.c
gcc -c -m64 -O2 mrcurve.c
gcc -c -m64 -O2 mrfast.c
gcc -c -m64 -O2 mrshs.c
gcc -c -m64 -O2 mrshs256.c
gcc -c -m64 -O2 mrshs512.c
gcc -c -m64 -O2 mrsha3.c
gcc -c -m64 -O2 mrfpe.c
gcc -c -m64 -O2 mraes.c
gcc -c -m64 -O2 mrgcm.c
gcc -c -m64 -O2 mrlucas.c
gcc -c -m64 -O2 mrzzn2.c
gcc -c -m64 -O2 mrzzn2b.c
gcc -c -m64 -O2 mrzzn3.c
gcc -c -m64 -O2 mrzzn4.c
gcc -c -m64 -O2 mrecn2.c
gcc -c -m64 -O2 mrstrong.c
gcc -c -m64 -O2 mrbrick.c
gcc -c -m64 -O2 mrebrick.c
gcc -c -m64 -O2 mrec2m.c
gcc -c -m64 -O2 mrgf2m.c
gcc -c -m64 -O2 mrflash.c
gcc -c -m64 -O2 mrfrnd.c
gcc -c -m64 -O2 mrdouble.c
gcc -c -m64 -O2 mrround.c
gcc -c -m64 -O2 mrbuild.c
gcc -c -m64 -O2 mrflsh1.c
gcc -c -m64 -O2 mrpi.c
gcc -c -m64 -O2 mrflsh2.c
gcc -c -m64 -O2 mrflsh3.c
gcc -c -m64 -O2 mrflsh4.c
cp mrmuldv.g64 mrmuldv.c
gcc -c -m64 -O2 mrmuldv.c
ar rc miracl.a mrcore.o mrarth0.o mrarth1.o mrarth2.o mralloc.o mrsmall.o mrzzn2.o mrzzn3.o
ar r miracl.a mrio1.o mrio2.o mrjack.o mrgcd.o mrxgcd.o mrarth3.o mrbits.o mrecn2.o mrzzn4.o
ar r miracl.a mrrand.o mrprime.o mrcrt.o mrscrt.o mrmonty.o mrcurve.o mrsroot.o mrzzn2b.o
ar r miracl.a mrpower.o mrfast.o mrshs.o mrshs256.o mraes.o mrlucas.o mrstrong.o mrgcm.o
ar r miracl.a mrflash.o mrfrnd.o mrdouble.o mrround.o mrbuild.o
ar r miracl.a mrflsh1.o mrpi.o mrflsh2.o mrflsh3.o mrflsh4.o
ar r miracl.a mrbrick.o mrebrick.o mrec2m.o mrgf2m.o mrmuldv.o mrshs512.o mrsha3.o mrfpe.o
rm mr*.o
gcc -m64 -O2 bmark.c miracl.a -o bmark
gcc -m64 -O2 fact.c miracl.a -o fact
g++ -c -m64 -O2 big.cpp
g++ -c -m64 -O2 zzn.cpp
g++ -c -m64 -O2 ecn.cpp
g++ -c -m64 -O2 ec2.cpp
g++ -c -m64 -O2 crt.cpp
g++ -m64 -O2 mersenne.cpp big.o miracl.a -o mersenne
g++ -m64 -O2 brent.cpp big.o zzn.o miracl.a -o brent
g++ -c -m64 -O2 flash.cpp
g++ -m64 -O2 sample.cpp flash.o miracl.a -o sample
g++ -m64 -O2 ecsgen.cpp ecn.o big.o miracl.a -o ecsgen
g++ -m64 -O2 ecsign.cpp ecn.o big.o miracl.a -o ecsign
g++ -m64 -O2 ecsver.cpp ecn.o big.o miracl.a -o ecsver
g++ -m64 -O2 pk-demo.cpp ecn.o big.o miracl.a -o pk-demo
g++ -c -m64 -O2 polymod.cpp
g++ -c -m64 -O2 poly.cpp
g++ -m64 -O2 schoof.cpp polymod.o poly.o ecn.o crt.o zzn.o big.o miracl.a -o schoof

三、使用Eclipse进行交叉编译,并在树莓派上运行pk-demo测试

1、创建交叉应用工程
在 Eclipse 主界面点击菜单 File > New > C/C++ Project > C++ Managed Build,在弹出的“C++ Project”对话框中,输入项目名称为 miracl_cross_pk_demo_cpp 。选择一个项目类型(如Executable/Empty Project),在 Toolchains 中一定要选 Cross GCC,这是CDT对交叉环境的支持,提供了额外的功能,以方便嵌入式应用程序的开发。

点击下一步,来到“Select Configurations”页面,我们采用默认,直接下一步,来到“Cross GCC Command”的设置。这里我们可以填写交叉编译工具链的交缀和路径,如:

Cross compiler prefix: arm-linux-gnueabihf-  #(别打错!)
Cross compiler path: /usr/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin

最后点击完成,一个交叉项目就创建好了。关于交叉编译前缀和路径的设置,在项目创建后,可以在项目的属性中改变它。

2、添加头文件及源文件

在miracl_cross_pk_demo_cpp项目中添加  include、src文件夹,其中include用于存放miracl相关文件,src用于存放pk-demo.cpp源文件

拷贝文件之前,先将arm版的mirdef.arm文件替换 mirdef.h 文件(此步骤重要!!!),

cp mirdef.arm mirdef.h  #试用arm版的mirdef头文件

然后再将以下文件从miracl文件夹中拷贝到 include 文件夹中(不需要拷贝mrmuldv.c,因为mrmuldv.c这个文件中的函数已经在mrcore.c文件中实现,否则会编译出错!!!)

big.cpp   mirdef.h   mrbuild.c   mrflash.c  mrgf2m.c   mrrand.c    mrstrong.c
big.h mraes.c mrcore.c mrflsh1.c mrio1.c mrround.c mrxgcd.c
crt.cpp mralloc.c mrcrt.c mrflsh2.c mrio2.c mrscrt.c mrzzn2b.c
crt.h mrarth0.c mrcurve.c mrflsh3.c mrjack.c mrsha3.c mrzzn2.c
ec2.cpp mrarth1.c mrdouble.c mrflsh4.c mrlucas.c mrshs256.c mrzzn3.c
ec2.h mrarth2.c mrebrick.c mrfpe.c mrmonty.c mrshs512.c mrzzn4.c
ecn.cpp mrarth3.c mrec2m.c mrfrnd.c mrpi.c mrshs.c zzn.cpp
ecn.h mrbits.c mrecn2.c mrgcd.c mrpower.c mrsmall.c zzn.h
miracl.h mrbrick.c mrfast.c mrgcm.c mrprime.c mrsroot.c

再将miracl中的 pk-demo.cpp 文件拷贝到 src 下,并改名为 main.cpp

3、设置工程属性(头文件包含位置)

右击工程,选择properties,在左侧栏中选中C/C++ Build → Settings → Tool Settings,Cross GCC Compiler 中的 includes 和 Cross G++ Compiler 中的 includes 都要添加本项目的include文件夹:

Apply and Close 应用并保存设置。

4、编译项目:Project > Build Project

编译成功,并产生一个 Debug 文件夹,再将 Debug下的 miracl_cross_pk_demo_cpp 可执行文件拷贝到树莓派中,

5、树莓派执行

将编译好的二进制文件拷贝到树莓派中执行

chmod 777 miracl_cross_pk_demo_cpp     #赋予可执行权限,否则执行不了
./miracl_cross_pk_demo_cpp #执行

树莓派成功执行 pk-demo 测试程序!!!

下一步将miracl编译为静态库,给国密SM9算法调用。

四、将miracl库交叉编译为静态库libmiracl.a

1、创建C++静态库应用工程
在 Eclipse 主界面点击菜单 File > New > C/C++ Project > C++ Managed Build,在弹出的“C++ Project”对话框中,输入项目名称为 miracl 。选择一个静态库项目类型(如 Static Library / Empty Project),在 Toolchains 中一定要选 Cross GCC,这是CDT对交叉环境的支持,提供了额外的功能,以方便嵌入式应用程序的开发。

点击下一步,来到“Select Configurations”页面,我们采用默认,直接下一步,来到“Cross GCC Command”的设置。这里我们可以填写交叉编译工具链的交缀和路径,如:

Cross compiler prefix: arm-linux-gnueabihf-  #(别打错!)
Cross compiler path: /usr/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin

最后点击完成,一个交叉静态库项目就创建好了。

2、添加头文件及源文件

在 miracl_cross 项目中添加  include 文件夹,其中 include 用于存放 miracl 相关的头文件,src 用于存放 miracl 相关的源文件

然后将 miracl_cross_pk_demo_cpp/include 中的 *.h 头文件拷贝到 miracl/include 中,

big.h  crt.h  ec2.h  ecn.h  miracl.h  mirdef.h  zzn.h

然后再将 miracl_cross_pk_demo_cpp/include 中的 *.c 和 *.cpp 源文件拷贝到 miracl/src 中,

big.cpp mrarth2.c mrdouble.c mrflsh3.c mrio2.c mrround.c mrstrong.c
crt.cpp mrarth3.c mrebrick.c mrflsh4.c mrjack.c mrscrt.c mrxgcd.c
ec2.cpp mrbits.c mrec2m.c mrfpe.c mrlucas.c mrsha3.c mrzzn2b.c
ecn.cpp mrbrick.c mrecn2.c mrfrnd.c mrmonty.c mrshs256.c mrzzn2.c
mraes.c mrbuild.c mrfast.c mrgcd.c mrpi.c mrshs512.c mrzzn3.c
mralloc.c mrcore.c mrflash.c mrgcm.c mrpower.c mrshs.c mrzzn4.c
mrarth0.c mrcrt.c mrflsh1.c mrgf2m.c mrprime.c mrsmall.c zzn.cpp
mrarth1.c mrcurve.c mrflsh2.c mrio1.c mrrand.c mrsroot.c

3、设置工程属性(头文件包含位置)

同样,右击工程,选择properties,在左侧栏中选中C/C++ Build → Settings → Tool Settings,Cross GCC Compiler 中的 includes 和 Cross G++ Compiler 中的 includes 都要添加本项目的include文件夹:

Apply and Close 应用并保存设置。

4、编译项目:Project > Build Project

编译成功,并在 Debug 文件夹生成一个 libmiracl.a 静态库文件,

下一步将miracl编译为静态库,给国密SM9算法调用。

五、调用第四步生成的静态库文件在树莓派上测试

1、创建应用工程
在 Eclipse 主界面点击菜单 File > New > C/C++ Project > C++ Managed Build,在弹出的“C++ Project”对话框中,输入项目名称为 miracl_cross_libtest 。选择一个项目类型(如Executable/Empty Project),在 Toolchains 中一定要选 Cross GCC,这是CDT对交叉环境的支持,提供了额外的功能,以方便嵌入式应用程序的开发。

点击下一步,来到“Select Configurations”页面,我们采用默认,直接下一步,来到“Cross GCC Command”的设置。这里我们可以填写交叉编译工具链的交缀和路径,如:

Cross compiler prefix: arm-linux-gnueabihf-  #(别打错!)
Cross compiler path: /usr/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin

最后点击完成,一个应用项目就创建好了。

2、添加头文件、源文件及库文件

在 miracl_cross_libtest 项目中添加  include、src、lib文件夹,其中include用于存放miracl相关头文件,src用于存放pk-demo.cpp源文件,lib用于存放libmiracl.a库文件。

将 miracl_cross/include 中的 *.h 头文件拷贝到 miracl_cross_libtest/include 中,

将 miracl_cross/Debug 中的 libmiracl.a 库文件拷贝到 miracl_cross_libtest/lib 中,

将 miracl中的 pk-demo.cpp 文件拷贝到 src 下,并改名为 main.cpp

3、设置工程属性(头文件与库文件包含位置)

右击工程,选择properties,在左侧栏中选中C/C++ Build → Settings → Tool Settings,Cross GCC Compiler 中的 includes 和 Cross G++ Compiler 中的 includes 都要添加本项目的include文件夹:

头文件不再截图,配置库文件 如下(Other options 不要添加内容!!!)

Apply and Close 应用并保存设置。

4、编译项目:Project > Build Project

编译成功,并产生一个 Debug 文件夹,再将 Debug下的 miracl_cross_libtest 可执行文件拷贝到树莓派中,

5、树莓派执行

将编译好的二进制文件拷贝到树莓派中执行

chmod 777 miracl_cross_libtest     #赋予可执行权限,否则执行不了
./miracl_cross_libtest #执行

树莓派成功执行 pk-demo 测试程序!!!

下一步将miracl编译为静态库,给国密SM9算法调用。

下一篇文章:

Linux实现树莓派3B的国密SM9算法交叉编译——(三)国密SM9算法实现

我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=4oq6ozctttwy

 

Linux实现树莓派3B的国密SM9算法交叉编译——(二)miracl库的测试与静态库的生成的更多相关文章

  1. Linux实现树莓派3B的国密SM9算法交叉编译——(三)国密SM9算法实现

    先参考这篇文章 Linux实现树莓派3B的国密SM9算法交叉编译——(二)miracl库的测试与静态库的生成 进行miracl库的交叉编译测试,并生成miracl静态链接库. 这篇文章主要介绍基于mi ...

  2. Linux实现树莓派3B的国密SM9算法交叉编译——(一)环境部署、简单测试与eclipse工程项目测试

    这篇文章主要介绍了交叉编译的实现,包括环境部署,并简单测试交叉编译环境是否安装成功. 一.交叉编译 在一个平台上生成另一个平台上的可执行代码.为什么要大费周折的进行交叉编译呢?一句话:不得已而为之.有 ...

  3. 国密SM9算法C++实现(Linux)

    首先参考 Linux下编译并使用miracl密码库 该博文在linux下编译Miracl库. 编译完了,自然是要用的,下面介绍两种在C程序中使用miracl库的方法. 方法一: 1. 源码编译完后的必 ...

  4. 谈谈PBOC3.0中使用的国密SM2算法

    转载请注明出处 http://blog.csdn.net/pony_maggie/article/details/39780825 作者:小马 一 知识准备 SM2是国密局推出的一种他们自己说具有自主 ...

  5. Java国密相关算法(bouncycastle)

    公用类算法: PCIKeyPair.java /** * @Author: dzy * @Date: 2018/9/27 14:18 * @Describe: 公私钥对 */ @Data @AllAr ...

  6. Linux下库的制作(静态库与共享库)

    库中实际上就是已编译好的函数代码,可以被程序直接调用. Linux下的库一般的位置在/lib或者/usr/lib中 静态库 静态库是复制拷贝到调用函数中的,函数运行的时候不再需要静态库,因为静态库是在 ...

  7. Qt生成和调用动态库dll,和静态库.a(windows和linux通用)

    系统1:ThinkPad T570.Windows10.QT5.12.2(Qt Creater 4.8.2)一.动态库.dll的创建和调用1.在qtcreater中按如下步骤创建动态库,动态库名为my ...

  8. 国密SM3算法在linux和windows平台结果不一致问题

    什么是sm3,是一种类似于sha256的哈希算法,是咱们国家的哈希标准算法: 最近在使用sm3算法时,同样的一份数据,调用同样的sm3接口,发现得到的结果是不一样的: 那么在应用过的过程中,如果同样的 ...

  9. 树莓派3b 换国内源 更新源

    在国内要更新源的时候,因为是国外的源,总会出现网速太慢的问题, 以下是对于安装了,2017-11-29-raspbian-stretch 系统源 更换最好用root登陆操作 sudo passwd r ...

随机推荐

  1. 前端Yslow的23个优化原则

    前端Yslow的23个优化原则 最常遇见的前端优化问题. Yslow是雅虎开发的基于网页性能分析浏览器插件,可以检测出网页的具体性能值,并且有著名的Yslow 23条优化规则,这23条,就够我们玩的了 ...

  2. SKlearn | 学习总结

    1 简介 scikit-learn,又写作sklearn,是一个开源的基于python语言的机器学习工具包.它通过NumPy, SciPy和Matplotlib等python数值计算的库实现高效的算法 ...

  3. 分类问题(四)ROC曲线

    ROC曲线 ROC曲线是二元分类器中常用的工具,它的全称是 Receiver Operating Characteristic,接收者操作特征曲线.它与precision/recall 曲线特别相似, ...

  4. Linux修复日志

    阿里云后台系统报告漏洞,解决记录 中级: RHSA-2019:0049-重要: systemd 安全更新

  5. numpy学习(一)

    (一)基础学习 学习渠道:阿里天池AI学习——Numpy基础(传送门) (二)练习篇 练习渠道:Numpy基础100题(Part 1) 1. Import the numpy package unde ...

  6. Wannafly Camp 2020 Day 7H 游戏 - 欧拉筛,GCD

    忘记特判 \(1\) ,血了一地 听说 \(O(n^2 \log n)\) 能过? #include <bits/stdc++.h> #define int long long using ...

  7. Keep、小红书、美图…独角兽App能拿到新一轮救命钱吗?

    大多数人热爱手机,不是因为时尚的外观或者结实的零部件,而是因琳琅满目的App赋予其太多的功能.智能手机最先是清理掉人类的零碎时间,现如今又开始肢解我们大块的时间,或者说,智能手机本身就是生活.在如此背 ...

  8. RN开发-Android原生交互

    在使用RN开发过程中,难免有些原生功能需要要自己来实现,下面总结一下在使用RN与原生开发交互. 1.在原生代码中定义实现类 1.1  首先继承 ReactContextBaseJaveModule抽象 ...

  9. Ant风格表达式

    1. ?:匹配任意一个字符 *   :匹配0或者任意数量的字符 **  :匹配0或更多的目录

  10. 部署Discuz和wordoress

    安装discuz 直接把安装包拷贝到根目录下 然后在浏览器中输入http://localhost/myweb/install/index.php 打开安装向导界面,需要修改一下myweb的权限 安全属 ...