基于padavan(openwrt) MIPS 的OpenSSL编译安装和编程小测
设备还是之前那个e8820s
先把gcc make perl装了
1 | opkg install gcc make perl |
这里有个问题,就是openssl 1.1.0之后的版本要求perl5.10,opkg安装的是5.28,运行./Configure会给报错
1 2 | Can't locate FindBin.pm in @INC (you may need to install the FindBin module) (@INC contains: /opt/lib/perl 5 / 5.28 ) at ./Configure line 15 . BEGIN failed--compilation aborted at ./Configure line 15 . |
百度查了下用root用户执行就可以了,但是又查到这padavan编译的时候直接就不允许root登录了,默认的admin账户做不到这些,叫我自己编一个算了目前没力,有空可以搞个超频的玩玩
所以只能先用着没呢么多要求的1.1.0以下的版本了
源码地址https://www.openssl.org/source/old/,这次用的版本是openssl-1.1.0-pre1
wget 或者下下来再 winscp传都行,同样的网络,用wget下的很慢
传到默认文件夹/opt/home/admin
解压进去直接运行配置文件,编译就好了,mt7621性能就那样,得跑半个多小时
1 2 | tar -zxvf openssl -1.1 . 1 k.tar.gz cd tar -zxvf openssl -1.1 . 1 k<br>./Configure<br>make<br>make install<br><br> |
最后 make install 的时候,会报错,不过好像对include和lib文件没什么影响
1 2 3 | installing man 1 /CA.pl. 1 /bin/sh: pod 2 man: not found make: *** [Makefile: 677: install_docs] Error 127 |
好了可以小测一下了,这里用的是简单的大数计算
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 | #include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <string.h> #include <openssl/bn.h> //namespace dakuang {} int main( int argc, char * argv[]) { { // 计算加法 BIGNUM* pBNa = BN_new(); BIGNUM* pBNb = BN_new(); BIGNUM* pBNr = BN_new(); BN_set_word(pBNa, 1); BN_set_word(pBNb, 2); int ret = BN_add(pBNr, pBNa, pBNb); printf ( "BN_add ret:%d \n" , ret); printf ( "BN_get_word:%d \n" , BN_get_word(pBNr)); char * pR = BN_bn2dec(pBNr); printf ( "1+2=%s \n" , pR); OPENSSL_free(pR); BN_free(pBNa); BN_free(pBNb); BN_free(pBNr); } { // 这里模拟了知道公钥的情况下,执行加密计算 // 计算次方 BN_CTX* pBNctx = BN_CTX_new(); BIGNUM* pBNr = BN_new(); BIGNUM* pBNa = BN_new(); BIGNUM* pBNp = BN_new(); BN_set_word(pBNa, 225); BN_set_word(pBNp, 29); int ret = BN_exp(pBNr, pBNa, pBNp, pBNctx); printf ( "BN_exp ret:%d \n" , ret); char * pR = BN_bn2dec(pBNr); printf ( "225^29=%s \n" , pR); OPENSSL_free(pR); // 计算除法 BN_CTX* pBNctx2 = BN_CTX_new(); BIGNUM* pBNdiv = BN_new(); BIGNUM* pBNrem = BN_new(); BIGNUM* pBNd = BN_new(); BN_set_word(pBNd, 323); ret = BN_div(pBNdiv, pBNrem, pBNr, pBNd, pBNctx2); printf ( "BN_div ret:%d \n" , ret); pR = BN_bn2dec(pBNrem); printf ( "(225^29)%323=%s \n" , pR); OPENSSL_free(pR); BN_free(pBNr); BN_free(pBNa); BN_free(pBNp); BN_free(pBNdiv); BN_free(pBNrem); BN_free(pBNd); BN_CTX_free(pBNctx); BN_CTX_free(pBNctx2); } { // 生成强随机数 BIGNUM* pBNr = BN_new(); int ret = BN_rand(pBNr, 8, -1, 1); printf ( "BN_rand ret:%d \n" , ret); char * pR = BN_bn2dec(pBNr); printf ( "rand %s \n" , pR); OPENSSL_free(pR); BN_free(pBNr); } { // 生成质数 BIGNUM* pBNr = BN_new(); int ret = BN_generate_prime_ex(pBNr, 16, 1, NULL, NULL, NULL); printf ( "BN_generate_prime_ex ret:%d \n" , ret); char * pR = BN_bn2dec(pBNr); printf ( "prime %s \n" , pR); OPENSSL_free(pR); BN_free(pBNr); } { // 计算最大公约数 BN_CTX* pBNctx = BN_CTX_new(); BIGNUM* pBNr = BN_new(); BIGNUM* pBNa = BN_new(); BIGNUM* pBNb = BN_new(); BN_set_word(pBNa, 10); BN_set_word(pBNb, 2); int ret = BN_gcd(pBNr, pBNa, pBNb, pBNctx); printf ( "BN_gcd ret:%d \n" , ret); char * pR = BN_bn2dec(pBNr); printf ( "10 and 2 gcd %s \n" , pR); OPENSSL_free(pR); BN_free(pBNr); BN_free(pBNa); BN_free(pBNb); BN_CTX_free(pBNctx); } return 0; } |
编译执行
1 | gcc -o to test.c -I /opt/home/admin/openssl-1.1.0-pre1/include -L /opt/home/admin/openssl-1.1.0-pre1 -lssl -lcrypto -lpthread -ldl |
1 | -I 和 -L 对应include和lib文件夹,不过编译出来的库文件在根目录,所以就直接写根目录了<br>注意-lssl -lcrypto要写在-ldl -lpthread前面,这四个必须要。<br><br>如果编译出来又运行不了,可以对执行文件用 ldd 看看是不是缺了哪个库文件<br><br> |

这个跑起来没问题
但这个base64的就跑不起来了,显示函数缺失,可能是1.1.0太老了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 | #include <stdio.h> #include <string.h> #include <openssl/evp.h> #include <openssl/x509.h> //Base64编码 void tEVP_Encode() { EVP_ENCODE_CTX *ctx; ctx = EVP_ENCODE_CTX_new(); //EVP编码结构体 unsigned char in[1024]; //输入数据缓冲区 int inl; //输入数据长度 char out[2048]={0}; //输出数据缓冲区 int outl; //输出数据长度 FILE *infp; //输入文件句柄 FILE *outfp; //输出文件句柄 infp = fopen ( "test.dat" , "rb" ); //打开待编码的文件 if (infp == NULL) { printf ( "Open File \"Test.dat\" for Read Err.\n" ); return ; } outfp = fopen ( "test.txt" , "w" ); //打开编码后保存的文件 if (outfp == NULL) { printf ( "Open File \"test.txt\" For Write Err.\n" ); return ; } EVP_EncodeInit(ctx); //Base64编码初始化 printf ( "文件\"Test.dat\" Base64编码后为:\n" ); //循环读取原文,并调用EVP_EncodeUpdate计算Base64编码 while (1) { inl = fread (in,1,1024,infp); if (inl <= 0) break ; EVP_EncodeUpdate(ctx,out,&outl,in,inl); //编码 fwrite (out,1,outl,outfp); //输出编码结果到文件 printf ( "%s" ,out); } EVP_EncodeFinal(ctx,out,&outl); //完成编码,输出最后的数据。 fwrite (out,1,outl,outfp); printf ( "%s" ,out); fclose (infp); fclose (outfp); printf ( "对文件\"Test.dat\" Base64编码完成,保存到\"test.txt\"文件.\n\n\n" ); } //Base64解码 void tEVP_Decode() { EVP_ENCODE_CTX *ctx; ctx = EVP_ENCODE_CTX_new(); //EVP编码结构体 char in[1024]; //输入数据缓冲区 int inl; //输入数据长度 unsigned char out[1024]; //输出数据缓冲区 int outl; //输出数据长度 FILE *infp; //输入文件句柄 FILE *outfp; //输出文件句柄 infp = fopen ( "test.txt" , "r" ); //打开待解码的文件 if (infp == NULL) { printf ( "Open File \"Test.txt\" for Read Err.\n" ); return ; } outfp = fopen ( "test-1.dat" , "wb" ); //打开解码后保存的文件 if (outfp == NULL) { printf ( "Open File \"test-1.txt\" For Write Err.\n" ); return ; } EVP_DecodeInit(ctx); //Base64解码初始化 printf ( "开始对文件\"Test.txt\" Base64解码...\n\n" ); //循环读取原文,并调用EVP_DecodeUpdate进行Base64解码 while (1) { inl = fread (in,1,1024,infp); if (inl <= 0) break ; EVP_DecodeUpdate(ctx,out,&outl,in,inl); //Base64解码 fwrite (out,1,outl,outfp); //输出到文件 } EVP_DecodeFinal(ctx,out,&outl); //完成解码,输出最后的数据。 fwrite (out,1,outl,outfp); fclose (infp); fclose (outfp); printf ( "对文件\"Test.txt\" Base64解码完成,保存为\"test-1.dat\"\n\n\n" ); } int main() { tEVP_Encode(); tEVP_Decode(); return 0; } |
报错如下
1 2 3 4 | /opt/bin/ld: /opt/tmp/ccpk2N8N.o: in function `tEVP_Decode': test2.c:(.text+0x35c): undefined reference to `EVP_ENCODE_CTX_new' /opt/bin/ld: test2.c:(.text+0x368): undefined reference to `EVP_ENCODE_CTX_new' collect2: error: ld returned 1 exit status |
参考
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具