使用RSA非对称密钥算法实现硬件设备授权
构思授权方案时,参考了下面网址的思路:
- 1.用户提供自己的硬件ID,从设备厂家得到一串授权序列号,在设备中输入序列号,设备即可激活使用.
序列号形如 :
1330-1440-1602-3671-9749-7897
XDM3T-W3T3V-MGJWK-8BFVD-GVPKY技术实现:授权序列号,是经过私钥加密的授权信息的字符串,设备中使用公钥解密,得到正确授权信息,则设备被激活.RSA非对称加密算法限制:授权信息需要尽量短,因为rsa加密算法库(openssl)可加密长度有限制(与私钥长度有关,未具体了解),所以要用尽量少的数据保存尽量长的授权信息.
- 2.用户提供自己的硬件ID,从设备厂家得到一个授权文件,在设备中上传授权文件,设备即可激活使用
授权文件中的内容形如:
{"ver": 1,"info": {"productid": "vW2TNOMlLvZdAgAF","invaliddate": "2014-05-16 11:40:30","userlimit": 100},"signature": [25, 218, 203, 190, 99, 76, 192, 136, 176, 181, 198, 128, 14, 250, 189, 198, 152, 208, 15, 202, 233, 77, 189, 3, 44, 113, 65, 231, 51, 100, 208, 127, 19, 255, 139, 174, 62, 9, 76, 165, 137, 15, 165, 178, 138, 9, 32, 218, 209, 222, 6, 234, 94, 5, 41, 130, 27, 232, 37, 195, 52, 120, 81, 143, 103, 40, 90, 93, 240, 115, 5, 117, 230, 65, 243, 182, 141, 64, 179, 140, 137, 155, 219, 75, 87, 83, 36, 49, 178, 210, 53, 171, 254, 28, 88, 39, 241, 57, 68, 204, 46, 231, 180, 133, 134, 108, 114, 243, 163, 30, 201, 103, 138, 15, 23, 247, 54, 32, 64, 181, 71, 12, 14, 88, 247, 156, 138, 32]}技术实现:授权文件包含明文的"授权信息"以及使用私钥进行的"授权信息的签名"组成的字符串.设备使用公钥进行签名的验证.(相对于序列号的几十个字符串来说,这里的字符串肯定会超过几百个,所以保存在文件中方便用户输入设备).
- 3.用户提供自己的硬件ID,设备厂家更新"授权服务器"中指定硬件的授权信息,设备会自动激活
技术实现:需要有一台公网服务器,处理查询授权信息的请求.用户不需要输入任何序列号,只需要点击一个"更新"按钮,设备主动发送自身的硬件唯一ID,向某一服务器请求授权信息(得到第2种方案中的授权文件),成功获取到后,设备会自动激活.

生成的序列号(或授权文件)中所包括的信息,这些信息指定了硬件设备可用的功能。比如授权到期时间、限制可用人数、限制硬件ID等等。
网上搜索加密算法库有很多,我本次使用的是openssl。
签名
使用私钥对“数据”的Hash值加密生成一个“签名值”,将“数据”和“签名值”一起发送出去。接收方使用公钥解密“签名值”得到一个Hash值h1,再对原始数据通过计算Hash值H2,对比H1和H2数据相同,则能保证此条信息是私钥拥有者发布的。其实和人类在合同上“签名”、“盖章”的方法一样,只是为了校验信息发布者的真伪。
|
openssl genrsa -out private.pem 2048
|
|
openssl rsa -in private.pem -pubout -out public.pem
|
|
int readpub_rsakey(const char *filename, RSA **prsa)
{
FILE *fp = fopen(filename, "r");
if (NULL == fp) {
printf("fopen() fail!\n");
return -1;
}
*prsa = PEM_read_RSA_PUBKEY(fp, NULL, NULL, NULL);
if (NULL == *prsa) {
printf("read_rsa_pubkey() fail!\n");
fclose(fp);
return -1;
}
fclose(fp);
return 0;
}
int readpri_rsakey(const char *filename, RSA **prsa)
{
FILE *fp = fopen(filename, "r");
if (NULL == fp) {
printf("fopen fail!\n");
return -1;
}
*prsa = PEM_read_RSAPrivateKey(fp, NULL, NULL, NULL);
if (NULL == *prsa) {
printf("read_rsa_prikey() fail!\n");
fclose(fp);
return -1;
}
fclose(fp);
return 0;
}
|
|
int getpub_rsakey(const char *key, RSA **prsa)
{
BIO *bio = NULL;
if (NULL == (bio = BIO_new_mem_buf((void*)key, -1))) {
printf("BIO_new_membuf() fail!\n");
return -1;
}
*prsa = PEM_read_bio_RSA_PUBKEY(bio, NULL, NULL, NULL);
if (!(*prsa)) {
printf("PEM_readbio_RSA_PUBKEY() fali!\n");
BIO_free_all(bio);
return -1;
}
return 0;
}
int getpri_rsakey(const char *key, RSA **prsa)
{
BIO *bio = NULL;
if (NULL == (bio = BIO_new_mem_buf((void*)key, -1))) {
printf("BIO_new_membuf() fail!\n");
return -1;
}
*prsa = PEM_read_bio_RSAPrivateKey(bio, NULL, NULL, NULL);
if (!(*prsa)) {
printf("PEM_read_bio_RSAPrivateKey() fail!\n");
BIO_free_all(bio);
return -1;
}
return 0;
}
|
|
int RSA_public_encrypt(int flen, const unsigned char *from,
unsigned char *to, RSA *rsa,int padding);
|
使用RSA非对称密钥算法实现硬件设备授权的更多相关文章
- Java中RSA非对称密钥加解密使用示例
一.简介: RSA加密算法是最常用的非对称加密算法,CFCA在证书服务中离不了它.RSA是第一个比较完善的公开密钥算法,它既能用于加密,也能用于数字签名.这个算法经受住了多年深入的密码分析,虽然密码分 ...
- RSA非对称算法实现HTTP密码加密传输
目前一般帐号系统,都是https来传输账户性息,申请一个https证书也不贵.但是网站的其它功能并不需要走https协议,https和http混布比较麻烦,所以决定先实现一个http协议传输RSA非对 ...
- JAVA RSA非对称加密详解[转载]
一.概述1.RSA是基于大数因子分解难题.目前各种主流计算机语言都支持RSA算法的实现2.java6支持RSA算法3.RSA算法可以用于数据加密和数字签名4.RSA算法相对于DES/AES等对称加密算 ...
- 写给开发人员的实用密码学(七)—— 非对称密钥加密算法 RSA/ECC
本文部分内容翻译自 Practical-Cryptography-for-Developers-Book,笔者补充了密码学历史以及 openssl 命令示例,并重写了 RSA/ECC 算法原理.代码示 ...
- RSA非对称算法(转)
RSA加密算法是最常用的非对称加密算法,CFCA在证书服务中离不了它.但是有不少新来的同事对它不太了解,恰好看到一本书中作者用实例对它进行了简化而生动的描述,使得高深的数学理论能够被容易地理解.我们经 ...
- rssh RSA(非对称密钥)
rssh ,非对称密钥,分为密钥和公钥 ,密钥在对面机器,需要进入的文件中,公钥是放在本地机器上 import paramiko private_key = paramiko.RSAKey.from_ ...
- Atitit RSA非对称加密原理与解决方案
Atitit RSA非对称加密原理与解决方案 1.1. 一.一点历史 1 1.2. 八.加密和解密 2 1.3. 二.基于RSA的消息传递机制 3 1.4. 基于rsa的授权验证机器码 4 1.5. ...
- SSH加密原理、RSA非对称加密算法学习与理解
首先声明一下,这里所说的SSH,并不是Java传统的三大框架,而是一种建立在应用层和传输层基础上的安全外壳协议,熟悉Linux的朋友经常使 用到一 个SSH Secure Shell Cilent的工 ...
- ssh rsa 非对称加密 基本原理
我们常用的ssh 免密登陆是用了 非对称加密的rsa算法(最为常用),与对称加密的相比会慢一些,但是更安全.秘钥长度超过768位无法破解. 默认长度是2048位(无法破解,非常安全) ssh-keyg ...
随机推荐
- JVM的stack和heap,JVM内存模型,垃圾回收策略,分代收集,增量收集
(转自:http://my.oschina.net/u/436879/blog/85478) 在JVM中,内存分为两个部分,Stack(栈)和Heap(堆),这里,我们从JVM的内存管理原理的角度来认 ...
- MyBaits的各种基本查询方式
<?xml version="1.0" encoding="gbk"?> <!DOCTYPE mapper PUBLIC "-//m ...
- asp开发微信扫码支付
这个任务已经给了.现在正在学习开发中.主要注意的是2点. 1:返回参数的验证. 2:通知后业务处理和处理后返回财付通.大部分操作,api中已经处理好. 现在需要的业务逻辑部分. 需要正确3个参数 r ...
- Perl date time
use Time::HiRes qw(time);use POSIX qw(strftime); my $t = time;my $date = strftime "%Y%m%d %H:%M ...
- iOS设备升级iOS7
引自:http://lifehacker.com/how-to-upgrade-to-ios-7-right-now-1288208215 Although iOS 7 won't see an of ...
- 用vi修改文件,保存文件时,提示“readonly option is set”的解决方法
来源:http://superuser.com/questions/300500/ubuntu-unable-to-edit-bashrc-file-because-of-readonly This ...
- C++ new、delete
C++中向系统申请堆内存的方法为使用new.new[]操作符,new申请单个对象的内存,new[]申请对象数组的内存.对应的delete.delete[]操作符将new.new[]操作符申请到的内存还 ...
- 如何将开源项目部分代码作为private放在github上?
很多时候,你的一些项目本身都是开源的,但是基于该开源项目,你可能做了部分更有价值的工作,或者由于其他原因,你不希望将这部分代码放到public上,那么有以下简单方法: 1. 创建一个private b ...
- Spring MVC 下index.jsp访问
spring-mvc.xml配置 <!-- 对模型视图名称的解析,即在模型视图名称添加前后缀 --> <bean class="org.springframework.we ...
- LA 4794 Sharing Chocolate
大白书中的题感觉一般都比较难,能理解书上代码就已经很不错了 按照经验,一般数据较小的题目,都有可能是用状态压缩来解决的 题意:问一个面积为x×y的巧克力,能否切若干刀,将其切成n块面积为A1,A2,, ...