secp192r1 ecdsa256r1 和sm2p256v1是两种算法吗

ECC证书验证方法_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
ECC证书验证方法
阅读已结束,下载文档到电脑
想免费下载更多文档?
定制HR最喜欢的简历
你可能喜欢【国密算法那点事儿】解读DES和SM4、RSA和SM2及SHA和SM3 - CSDN博客
【国密算法那点事儿】解读DES和SM4、RSA和SM2及SHA和SM3
转载自:/a/844743.html
安全是智能卡的核心,而算法是安全的基础。
国密算法由国家密码局发布,包含SM1\ SM2\ SM3\ SM4\ SSF33算法;国际算法由美国的安全局发布,是现今最通用的商用算法。今天小钞就以分组密码算法(DES和SM4)、公钥密码算法(RSA和SM2)、摘要算法(SM3)为例,和大家谈谈国际算法和国密算法的区别。
  1、分组密码算法——国际DES、国产SM4
  分组密码就是将明文数据按固定长度进行分组,然后在同一密钥控制下逐组进行加密,从而将各个明文分组变换成一个等长的密文分组的密码。其中二进制明文分组的长度称为该分组密码的分组规模。
  分组密码的实现原则如下:
  (1)必须实现起来比较简单,知道密钥时加密和脱密都十分容易,适合硬件和(或)软件实现.
  (2)加脱密速度和所消耗的资源和成本较低,能满足具体应用范围的需要.
  分组密码的设计基本遵循混淆原则和扩散原则。
  混淆原则就是将密文、明文、密钥三者之间的统计关系和代数关系变得尽可能复杂,使得敌手即使获得了密文和明文,也无法求出密钥的任何信息;即使获得了密文和明文的统计规律,也无法求出明文的任何信息。
  扩散原则就是应将明文的统计规律和结构规律散射到相当长的一段统计中去。也就是说让明文中的每一位影响密文中的尽可能多的位,或者说让密文中的每一位都受到明文中的尽可能多位的影响。
  DES算法
  DES算法是在美国NSA(国家安全局)资助下由IBM公司开发的密码算法,其初衷是为政府非机密的敏感信息提供较强的加密保护。它是美国政府担保的第一种加密算法,并在1977年被正式作为美国联邦信息处理标准。DES主要提供非军事性质的联邦政府机构和私营部门使用,并迅速成为名声最大,使用最广的商用密码算法。
  DES算法的整体结构图:
  2006年我国公布了无限局域网产品使用的SM4密码算法。这是我国第一次公布自己的商用密码算法。
  SM4算法的整体结构图:
  国际的DES算法和国产的SM4算法的目的都是为了加密保护静态储存和传输信道中的数据,主要特性如下:
  从算法上看,国产SM4算法在计算过程中增加非线性变换,理论上能大大提高其算法的安全性,并且由专业机构进行了密码分析,民间也对21轮SM4进行了差分密码分析,结论均为安全性较高。
 2、公钥密码算法——国际RSA、国产SM2
  公钥密码学与其他密码学完全不同, 使用这种方法的加密系统,不仅公开加密算法本身,也公开了加密用的密钥。
  公钥密码系统与只使用一个密钥的对称传统密码不同,算法是基于数学函数而不是基于替换和置换。公钥密码学是非对称的,它使用两个独立的密钥,即密钥分为公钥和私钥,因此称双密钥体制。双钥体制的公钥可以公开,因此称为公钥算法。
  公钥算法的出现,给密码的发展开辟了新的方向。公钥算法虽然已经历了20多年的发展,但仍具有强劲的发展势头,在鉴别系统和密钥交换等安全技术领域起着关键的作用
  公钥算法的加密与解密由不同的密钥完成,并且从加密密钥得到解密密钥在计算上是不可行的。通常,公钥算法的两个密钥中任何一个都可以作为加密而另一个用作解密,但不是所有的公钥算法都是如此。
  RSA算法由Rivest、Shamir、Adleman于1978年首次发表,是迄今为止最容易理解和实现的公钥算法,已经受住了多年深入的攻击,其理论基础是一种特殊的可逆模幂运算,其安全性基于分解大整数的困难性。
  RSA算法既可用于加密,又可用于数字签名,已得到广泛采用,并被许多标准化组织(如ISO、ITU、IETF和SWIFT等)接纳。目前许多国家标准仍采用RSA算法或它的变型。
  RSA算法的实现如下:
  (1) 实现者寻找出两个大素数p和q
  (2) 实现者计算出n=pq 和φ(n)=(p-1)(q-1)
  (3) 实现者选择一个随机数e (0&e&&&/e&&
  (4) 实现者使用辗转相除法计算d=e-1(modφ(n))
  (5) 实现者在目录中公开n和e作为公钥
  密码分析者攻击RSA体制的关键点在于如何分解n。若分解成功使n=pq,则可以算出φ(n)=(p-1)(q-1),然后由公开的e,解出秘密的d。所以说RSA算法的安全性基于分解大整数的困难性。
  SM2算法
  SM2算法由国家密码管理局于日发布,全称为椭圆曲线算法。椭圆曲线并不是椭圆,之所以称为椭圆曲线是因为它们是用三次方程来表示的,并且该方程与计算椭圆周长的方程相似。一般而言,椭圆曲线的三次方程形为:
  y2+axy+by=x3+cx2+dx+e [其中a,b,c,d和e是满足某些条件的实数,因为方程中的指数最高是3,所以我们称之为三次方程,或者说方程的次数为3]
  SM2算法使用的方程为:y2= x3 + ax + b
  SM2算法实现如下:
  (1) 选择Ep(a,b)的元素G,使得G的阶n是一个大素数
  (2) G的阶是指满足nG=O的最小n值
  (3) 秘密选择整数k,计算B=kG,然后公开(p,a,b,G,B),B为公钥,保密k,k为私钥
  加密M:先把消息M变换成为Ep(a,b)中一个点Pm,然后,选择随机数r,计算密文Cm={rG,Pm+rP),如果r使得rG或者rP为O,则要重新选择r。
  解密Cm: (Pm+rP)-k(rG)=Pm+rkG-krG=Pm
  SM2算法的安全性基于一个数学难题”离散对数问题ECDLP”实现,即考虑等式Q=KP,其中Q、P属于Ep(a,b),K&p,则:1) p=&& 已知q和p,计算k,是困难的。&=&&&
  现今对椭圆曲线研究的时间短,经过许多优秀的数学家的努力,至今一直没有找到亚指数级算法。正是由于目前所知求解ECDLP的最好方法是指数级的,这使得我们选用SM2算法作加解密及数字签名时,所要求的密钥长度比RSA要短得多。
  国际的RSA算法和国产的SM2算法的主要特性对比如下:
 摘要算法——国产SM3
  摘要函数在密码学中具有重要的地位,被广泛应用在数字签名,消息认证,数据完整性检测等领域。摘要函数通常被认为需要满足三个基本特性:碰撞稳固性,原根稳固性和第二原根稳固性。
  2005年,Wang等人给出了MD5算法和SHA-1算法的碰撞攻击方法,现今被广泛应用的MD5算法和SHA-1算法不再是安全的算法。
  SM3密码摘要算法是中国国家密码管理局2010年公布的中国商用密码杂凑算法标准。SM3算法适用于商用密码应用中的数字签名和验证,是在SHA-256基础上改进实现的一种算法。SM3算法采用Merkle-Damgard结构,消息分组长度为512位,摘要值长度为256位。
  SM3算法的压缩函数与SHA-256的压缩函数具有相似的结构,但是SM3算法的设计更加复杂,比如压缩函数的每一轮都使用2个消息字。
  现今为止,SM3算法的安全性相对较高。(来源:中钞研究院)
本文已收录于以下专栏:
相关文章推荐
AES与SM4实现原理的比较基本比较三种算法的基本比较如下表:
128/192/256
国密即国家密码局认定的国产密码算法。主要有SM1,SM2,SM3,SM4。密钥长度和分组长度均为128位。
SM1 为对称加密。其加密强度与AES相当。该算法不公开,调用该算法时,需要通过加密芯片的...
SM4国密算法实现分析代码下载请见 上一篇文章 AES算法实现分析SM4的说明(pdf):http://download.csdn.net/detail/leechiyang/5008528算法调用参...
最近浏览了一下国密办的官方网站,新公布了国密算法标准,其中有SM4算法,说明为原SMS4算法,既无线局域网标准的分组数据算法,可参考
:http://www./News/201...
他的最新文章
讲师:宋宝华
讲师:何宇健
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)2318人阅读
SM2是一种非对称秘钥加密算法。用最明白的话说:
从一个私钥可以生成唯一一个公钥(不考虑随机数,在这里把随机数固定),所以测试工具里先输入私钥再点击生成秘钥对
一个公钥可以找出很多私钥
加密时输入的参数是:公钥和明文,输出:密文
解密时输入参数是:私钥和密文,输出:明文
选择一样的曲线,在官网的示例中有两条曲线,最后推荐的又是另一种曲线,网上的很多测试工具都是基于推荐曲线做的。官网链接
公钥是坐标点:P(Px,Py)
网上的测试工具有的输入输出都是16进制的,有的输入输出都是10进制的,要一致
加密时也会用随机数,如果随机数固定,则公钥也是固定的,密文也是固定的
SM2分为秘钥交换,签名验证,公钥加密,网上的好多代码都是前两个,没有公钥加密,本文写的就是公钥加密
我用的sm2的c语言代码的下载地址是:
密文分为C1,C2,C3,三部分,C1长度是64,C2是明文的长度,C3是32位
C1 || C2 || C3 的意思就是拼在一起,而不是做什么或运算
现在把第10点的代码集合到自己的工程:
1.将不需要的文件删除,即下图红方框里的文件
注意:这些文件的编码格式不是utf8的,在xcode里面中文会显示成乱码,这些中文注释一定要看,在Windows系统下看。
2.导入到ios工程里,编译报错,没有openssl/ec.h这个文件
3.查一下什么是openssl,是关于密码的第三方开源库,然后需要把它集成到我们工程里。
3.1到下载下来,是1.0.2版本的。下载后的文件是:
3.2只看build-libssl.sh文件,打开mac电脑的终端程序,将这个sh文件直接拖到终端里
3.3点回车,它会自动下载openssl的源代码并生成多个指令集的静态库。当然需要10分钟左右时间
3.4 openssl的源代码和编译好的静态库在mac电脑的根目录下: /Users/用户名/OpenSSL_1_0_2h.tar.gz
3.5在3.4的bin目录下就是编译好的静态库,包括
3.6 以iPhoneOS9.3-arm64.sdk文件夹为例:
3.7 lib目录下的libcrypto.a和libssl.a是生成的静态库,include目录下的openssl文件夹是对应的头文件。
3.8这个是arm64的库,如果同时需要支持armv7 arm64 则要将两个静态库合成一个,用命令:lipo -create
/Users/yyy/Desktop/合到一起/libcrypto7.a
/Users/yyy/Desktop/合到一起/libcrypto64.a
-output /Users/yyy/Desktop/合到一起/libcrypto.a
3.9将这三个文件导入到我们工程里,编译一下,报错还是和之前一样:’openssl/ec.h’ file not found。点击xcode工程的搜索和替换,填写下面信息,点全部替换
4编译一下,报错
duplicate symbol _main in:
5.将sm2.c里面的main函数改名为mianSM2, 现在编译通过。
上面的中文注释很重要!只看part4是SM2公钥加密,
这四个是官网的示例曲线
sm2_param_fp_192,
sm2_param_fp_256,
sm2_param_f2m_193,
sm2_param_f2m_257,
这个是官网推荐曲线,用这个
sm2_param_recommand
在工程里需要的地方调用
test_part4(sm2_param_recommand, TYPE_GFp, 256);
这个方法。
5在编译可能会报错
把RSA改成RSA_Y
6.这是控制台的输出:
1649AB77 A00637BD 5E2EFE28 3FBF3535 34AA7F7C B89463F2 08DDBC29 20BB0DA0
key_B-&P-&x:
191BFF81 48006EEA 72D857CB 974DB9F4 903B3CA3 655D8D59 7AD4663F 5044DCB1
key_B-&P-&y:
E2F7888A F1FCD8C6 53A8059C D2F37985 5389F71A 7709E2C1 EE1E914C 855EF119
(BYTE *)H:
B2054BCB 433B430C F6141BCF 2C98F617 7C78C6E5 ED5F953E E92B1F70 AAF70233
message_data-&C_2:
D76B28B9 3A4B3765 997A3BBC 58F99873 1D0AA2
1649AB77 A00637BD 5E2EFE28 3FBF3535 34AA7F7C B89463F2 08DDBC29 20BB0DA0
B18FE085 4DAF664D 357BD2DA 38714F02 026CF4A7 62BEFF0C DEFEE1AF 002DA0EE
38ED9760 EF652F28 B81732B9
87642E30 D9DFA9B3 C307A092 E415B07F
(BYTE *)H:
B2054BCB 433B430C F6141BCF 2C98F617 7C78C6E5 ED5F953E E92B1F70 AAF70233
decrypt: len: 19
encryption standard
key_B-&d:私钥
key_B-&P-&x:公钥x
key_B-&P-&y:公钥y
(BYTE *)H:t
message_data-&C_2:C2
有几个问题:
1.输出的长度不全(输出C,C1时)
2.这个方法加密解密是放在一起的
3.明文输入的是字符串,而不是16进制的char数组
7.把这个方法分成加密和解密两个方法
void sm2JiaMi(char **sm2_param, int type, int point_bit_length , char *mingwen,char *miwen)
ec_param *
sm2_ec_key *key_B;
message_st message_
ecp = ec_param_new();
ec_param_init(ecp, sm2_param, type, point_bit_length);
key_B = sm2_ec_key_new(ecp);
sm2_ec_key_init(key_B, sm2_param_d_B[ecp-&type], ecp);
memset(&message_data, 0, sizeof(message_data));
message_data.message = (BYTE *)
message_data.message_byte_length = (int)strlen((char *)message_data.message);
message_data.klen_bit = message_data.message_byte_length * 8;
sm2_hex2bin((BYTE *)sm2_param_k[ecp-&type], message_data.k, ecp-&point_byte_length);
sm2_bn2bin(key_B-&P-&x, message_data.public_key.x, ecp-&point_byte_length);
sm2_bn2bin(key_B-&P-&y, message_data.public_key.y, ecp-&point_byte_length);
DEFINE_SHOW_BIGNUM(key_B-&P-&x);
DEFINE_SHOW_BIGNUM(key_B-&P-&y);
sm2_encrypt(ecp, &message_data);
memcpy(miwen, message_data.C, sizeof(message_data.C));
sm2_ec_key_free(key_B);
ec_param_free(ecp);
void sm2Jiemi(char **sm2_param, int type, int point_bit_length , char *miwen ,char output[] ){
ec_param *
sm2_ec_key *key_B;
message_st message_
ecp = ec_param_new();
ec_param_init(ecp, sm2_param, type, point_bit_length);
key_B = sm2_ec_key_new(ecp);
sm2_ec_key_init(key_B, sm2_param_d_B[ecp-&type], ecp);
memset(&message_data, 0, sizeof(message_data));
message_data.message_byte_length = 6;
message_data.klen_bit = message_data.message_byte_length * 8;
sm2_bn2bin(key_B-&d, message_data.private_key, ecp-&point_byte_length);
DEFINE_SHOW_BIGNUM(key_B-&d);
message_data.decrypt = (BYTE *)OPENSSL_malloc(message_data.message_byte_length + 1);
memset(message_data.decrypt, 0, message_data.message_byte_length+1);
for (int i = 0; i & 256; i++)
message_data.C[ i] =
DEFINE_SHOW_STRING(message_data.C, 256);
sm2_decrypt(ecp, &message_data);
memcpy(output, message_data.decrypt, 100);
OPENSSL_free(message_data.decrypt);
sm2_ec_key_free(key_B);
ec_param_free(ecp);
这是如何在ios工程调用上面两个方法
NSString *mingwen = @"123456";
char miwen[1024];
sm2JiaMi(sm2_param_recommand, TYPE_GFp, 256, [mingwen UTF8String], miwen);
NSData *miwendata =
[[NSData alloc]initWithBytes:miwen length: mingwen.length+32+64 +2];
NSLog(@"密文data=%@",
miwendata );
char output[100];
sm2Jiemi(sm2_param_recommand, TYPE_GFp, 256, miwen,output);
NSString *mingwenout = [[NSString alloc]initWithCString:output encoding:NSUTF8StringEncoding];
NSLog(@"---解密后%@---",mingwenout);
如果需要传入自己公钥加密,则加密方法要相应改一下
void sm2JiaMiWithPublicKey(char **sm2_param, int type, int point_bit_length , char mingwen[],char *miwen,unsigned char px[],unsigned char py[]){
ec_param *
sm2_ec_key *key_B;
message_st message_
ecp = ec_param_new();
ec_param_init(ecp, sm2_param, type, point_bit_length);
key_B = sm2_ec_key_new(ecp);
sm2_ec_key_init(key_B, sm2_param_d_B[ecp-&type], ecp);
memset(&message_data, 0, sizeof(message_data));
message_data.message = (BYTE*)
message_data.message_byte_length = 8;
message_data.klen_bit = message_data.message_byte_length * 8;
static const char rnd_seed[] = "random num c random num seed random num c random num seed";
RAND_seed(rnd_seed, sizeof rnd_seed);
unsigned char suijishu[32];
RAND_pseudo_bytes(suijishu,32);
for( int i=0;i&sizeofi++){
message_data.k[i]=suijishu[i];
printf("\n");
DEFINE_SHOW_STRING(message_data.k, sizeof(message_data.k));
for( int i=0;i&32;i++){
message_data.public_key.x[i]=px[i];
for( int i=0;i&32;i++){
message_data.public_key.y[i]=py[i];
DEFINE_SHOW_BIGNUM(key_B-&P-&x);
DEFINE_SHOW_BIGNUM(key_B-&P-&y);
DEFINE_SHOW_STRING(message_data.public_key.x, 32);
DEFINE_SHOW_STRING(message_data.public_key.y, 32);
sm2_encrypt(ecp, &message_data);
memcpy(miwen, message_data.C, sizeof(message_data.C));
sm2_ec_key_free(key_B);
ec_param_free(ecp);
调用方法是
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSString *mingwen = @"123456";
char miwen[1024];
NSString *px_ = [@"F5AB4BCC 007AF4C3 862CF413 57C035AE 090B39B3 A7204E2D EEC507A" stringByReplacingOccurrencesOfString:@" " withString:@""];
NSString *py_ = [@"BE394FC1 0F50FC59 FF575 BC1214FE D849E967 D15993FF" stringByReplacingOccurrencesOfString:@" " withString:@""];
NSData *px_data = [self dataFromHexString:px_];
NSData *py_data = [self dataFromHexString:py_];
sm2JiaMiWithPublicKey(sm2_param_recommand, TYPE_GFp, 256, [mingwen UTF8String], miwen, px_data.bytes,py_data.bytes);
NSData *miwendata = [[NSData alloc]initWithBytes:miwen length: mingwen.length+32+64 +2];
NSLog(@"密文data=%@", miwendata );
char output[100];
sm2Jiemi(sm2_param_recommand, TYPE_GFp, 256, miwen,output);
NSString *mingwenout = [[NSString alloc]initWithCString:output encoding:NSUTF8StringEncoding];
NSLog(@"---解密后%@---",mingwenout);
return YES;
- (NSData *)dataFromHexString:(NSString *)input {
const char *chars = [input UTF8String];
int i = 0;
NSUInteger len = input.length;
NSMutableData *data = [NSMutableData dataWithCapacity:len / 2];
char byteChars[3] = {'\0','\0','\0'};
unsigned long wholeB
while (i & len) {
byteChars[0] = chars[i++];
byteChars[1] = chars[i++];
wholeByte = strtoul(byteChars, NULL, 16);
[data appendBytes:&wholeByte length:1];
发现有崩溃,把char miwen[100] 改成 char miwen[1024]即可,文章中已修改()
最新代码已上传 :
这是修正后的代码地址()
//最新代码 增加使用自定义私钥解密,加解密时04的处理
明文不限制位数
解决闪退的demo
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:36798次
排名:千里之外
原创:39篇
评论:34条
(3)(1)(2)(4)(8)(3)(2)(1)(5)(2)(1)(4)(3)
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'310被浏览29399分享邀请回答18737 条评论分享收藏感谢收起1710 条评论分享收藏感谢收起查看更多回答

我要回帖

更多关于 secp384r1 的文章

 

随机推荐