欢迎来到皮皮网网首页

【淘宝领券源码】【税务系统源码】【刷单大厅源码】ecc源码

来源:python erp 源码 时间:2024-11-23 12:29:03

1.如何破解ECC6.0不用申请Access key
2.SAP高级应用开发图书目录
3.密码学开源库整理
4.什么是ECC内存?
5.中国当年的winXP盗版系统是谁做出来的? - 知乎
6.求一个基于openssl写的ecc曲线的源代码

ecc源码

如何破解ECC6.0不用申请Access key

       ã€€ã€€ä¸€ï¼šåŽ»æŽ‰æƒé™åˆ¤æ–­æ–‡ä»¶LSKEYF的只读属性:

       ã€€ã€€1,Tcode处输入SE回车(Tcode处就是指登陆sap后界面上放的可输入框)。

       ã€€ã€€2,按F6(Tips&Tricks)(这里2,3步是以IDES4.7c为标准的,如果你用的4.6,按f6后会出现一个列表,随便选一个进入,会出现一个分为左右的程序显示框,先把左右的程序全部删除掉,然后参照第三步继续。ecc6.0与本4.7基本相同)

       ã€€ã€€3,在右边写下面一段程序,

       ã€€ã€€Update PROGDIR set edtx = ''

       ã€€ã€€Where

       ã€€ã€€name = 'LSKEYF'

       ã€€ã€€And

       ã€€ã€€state = 'A'.

       ã€€ã€€4,F8执行,这时文件LSKEYF的Editor lock就会打开,也就是说将这个文件更改为可以编辑。等于windows下面取消只读权限。

       ã€€ã€€äºŒï¼šåœ¨æƒé™åˆ¤æ–­æ–‡ä»¶é‡Œé¢åŠ ä¸Šæ–­ç‚¹ï¼Œé˜»æ–­æƒé™åˆ¤æ–­ã€‚

       ã€€ã€€5,返回到起始页面,Tcode输入SE回车。

       ã€€ã€€6,程序输入LSKEYF。

       ã€€ã€€7,点display(显示)。

       ã€€ã€€8,找到 JUMP_THE_WALL 块,

       ã€€ã€€ç„¶åŽåœ¨è¿™å—中找到下面这段

       ã€€ã€€CALL 'GET_DEVELOPER_KEY' ID 'NAME' FIELD 'ABCDEFGHIJKL'

       ã€€ã€€ID 'CUSTID' FIELD ''

       ã€€ã€€ID 'KEY' FIELD DUMMY_KEY.

       ã€€ã€€9,把光标放在dummy_key后面.点击页面上的红色stop(ecc6.0里面没有红色stop,但是有两个“添加断点”,选第二个吧,第一个没有试),在这里添加一个断点,此时上面的最后一行会变为黄色。

       ã€€ã€€ï¼Œç‚¹å‡»åŽé¢ä¸€ä¸²å›¾æ ‡ä¸­å€’数第四个(创建新的会话),会出现一个新的操作界面窗口,在新窗口的Tcode输入se回车。(这里如果不这样打开新窗口的话,有可能会造成不能进入断点的状况,我破解6.0时出现过。)

       ã€€ã€€ä¸‰ï¼šé€æ­¥ä¿®æ”¹æƒé™åˆ¤æ–­æ–‡ä»¶ä¸­çš„判断参数的值,达到绕过权限判断的目的。

       ã€€ã€€ï¼Œç¨‹åºè¾“å…¥LSKEYF。点change(修改),程序会进入断点。

       ã€€ã€€ï¼Œæ­¤æ—¶ç•Œé¢ä¸‹é¢æœ‰è¿žç»­å››è¡Œç™½è‰²çš„输入框,后面是四行灰色的框。在第一个白色框里面输入sy-subrc回车。(在ecc6.0里面,这里的白色输入框在右边,输入sy-subrc回车后,后面的灰框并不会变成白色,需要双击后面的铅笔才可以。更改后按回车确认。继续步)

       ã€€ã€€ï¼Œæ­¤æ—¶è¯¥è¡ŒåŽé¢çš„原本灰色的框会变白色,并且出现一个值,将这个值改为0并点击后面的铅笔进行保存。(6.0参照第步)

       ã€€ã€€ï¼ŒæŒ‰f6(单步执行程序),如果输入框中的0变成其它值,将它再改成0丙点击后面的铅笔进行保存。(6.0参照第步)

       ã€€ã€€ï¼Œå†æ¬¡æŒ‰ä¸€ä¸‹f6,这个值将不再变化(我总共改了两次0),如果程序跳转到endform这个值也没有改变,说明更改成功了。按f8(从断点开始运行完程序)。

       ã€€ã€€ï¼Œä¸Šæ­¥æŒ‰f8后,程序会跳出一个或者几个信息框,不必理会,确认,就会出现一个白底灰字的界面,里面是程序源代码,但因为不能修改,所以是灰色的。

       ã€€ã€€å››ï¼šé€šè¿‡æ’入可执行代码的方法修改权限判断文件,一劳永逸。

       ã€€ã€€ï¼Œè¿™æ—¶è¿˜æ˜¯æ‰¾åˆ°ä¸Šæ¬¡æ·»åŠ æ–­ç‚¹é‚£é‡Œï¼Œ

       ã€€ã€€CALL 'GET_DEVELOPER_KEY' ID 'NAME' FIELD 'ABCDEFGHIJKL'

       ã€€ã€€ID 'CUSTID' FIELD ''

       ã€€ã€€ID 'KEY' FIELD DUMMY_KEY.

       ã€€ã€€æŠŠå…‰æ ‡æ”¾åœ¨dummy_key.后面,点击界面上的“插入”按钮(快捷键ctrl+shift+f8),屏幕中就会出现

       ã€€ã€€*{ INSERT rightboy 1

       ã€€ã€€

*

       ã€€ã€€*} INSERT

       ã€€ã€€å…¶ä¸­ç¬¬ä¸€è¡Œçš„后面那串字符串可能会不一样。这时只有中间的*那一行是可以输入的,将*删掉,加入

       ã€€ã€€sy-subrc = 0.

       ã€€ã€€ä¹Ÿå°±æ˜¯å°†åˆšæ‰çš„内容更改为如下:

       ã€€ã€€*{ INSERT rightboy

       ã€€ã€€sy-subrc = 0.

       ã€€ã€€*} INSERT

       ã€€ã€€ï¼Œç‚¹å‡»ä¿å­˜ï¼Œç¨‹åºä¼šå†æ¬¡è·³åˆ°æ–­ç‚¹ï¼ŒæŒ‰ç…§-的步骤继续更改那个值为0并继续,最后会提示保存成功。(如果提示选择session,可以自己点击"新建"随便建立一个,摸索两下就能搞定,此处不再赘述)

       ã€€ã€€ï¼Œç„¶åŽç‚¹å‡»ç¨‹åº-激活(快捷键ctrl+f3)(这里,我在破解另外一个4.6c的时候“激活”按钮并不可能,其实此处激活是自动的,不必理会,你会看到显示的程序名的后面有一个“活动的”或者“active”的标记,如果没有,“激活”按钮一定可用),如果还跳到断点,请继续按照上述步骤更改值,最后会提示激活成功。

       ã€€ã€€ï¼Œå…³é—­æ‰€æœ‰çš„ides登陆界面,重新登陆ides,Tcode输入se回车,程序输入LSKEYF。点display(显示)。找到刚才修改的地方,应该发现刚才的添加成功了。

       ã€€ã€€ï¼Œæˆ‘通过破解大致了解了这个程序文件的内容,这程序就是ides判断是否有key的判断程序,当sy-subrc = 0的时候,就有权限访问,如果不满足一些条件,sy-subrc 就会改变,所以在这里强制它变为0,就等于破解掉了。于是我就重复步骤将原码变成下列的样子:

       ã€€ã€€CALL 'GET_DEVELOPER_KEY' ID 'NAME' FIELD 'ABCDEFGHIJKL'

       ã€€ã€€ID 'CUSTID' FIELD ''

       ã€€ã€€ID 'KEY' FIELD DUMMY_KEY.

       ã€€ã€€*{ INSERT rightboy 1

       ã€€ã€€sy-subrc = 0.

       ã€€ã€€*} INSERT

       ã€€ã€€CHECK SY-SUBRC EQ 2. "customer system!

       ã€€ã€€*{ INSERT rightboy 2

       ã€€ã€€sy-subrc = 0.

       ã€€ã€€*} INSERT

       ã€€ã€€MOVE SPACE TO DUMMY_KEY.

       ã€€ã€€*{ INSERT rightboy 3

       ã€€ã€€sy-subrc = 0.

       ã€€ã€€*} INSERT

       ã€€ã€€RC = 0.

       ã€€ã€€ENDFORM. " JUMP_THE_WALL

       ã€€ã€€ä»¥ä¸Šä¸€åˆ‡æ­¥éª¤å®Œæ¯•ï¼Œæˆ‘后来又破解了几个不同版本的系统,并将上述步骤完善了一下,4.6,4.7,6.0都可以用此方法破解,其中比较关键的是第一步,去掉LSKEYF文件的editor lock,其他步骤大同小异

SAP高级应用开发图书目录

       第0章 新一代SAP系统、产品及架构

       本章节概述了新一代SAP系统的组成部分,包括R/3、ECC、NetWeaver和SAP ERP。详细解释了R/3和ECC的淘宝领券源码三层架构,以及NetWeaver的ABAP/Java双重架构。

       第1章 RFC基础

       深入探讨了RFC基础,包括RFC概述、支持远程调用的功能模块RFM、维护远程目标和SAPA BAP系统间的RFC实现。具体内容涉及RFC通信模式、调用SAP标准RFM、创建定制RFM示例、远程RFM调用概述、同步、异步、并行和事务性调用方式,以及本地RFM调用和回调等。

       第2章 BAPI和业务对象

       本章介绍了SAP业务对象概念、SAP BAPI的概述及其在ABAP中的调用,从外部系统访问BAPI,以及BAPI与业务对象设计、创建业务对象的BAPI等主题。

       第3章 ALE技术

       探讨了ALE技术的概述、集成的ERP系统和分布式业务过程、ALE基础、定制数据的同步以及ALE处理流程。详细说明了通过BAPI的分布流程、通过消息类型的分布流程、错误处理和SAP-非SAP系统ALE实现流程。

       第4章 IDoc技术

       阐述了IDoc技术的概述、结构和类型、版本控制、IDoc处理流程(出站和入站处理、状态处理和异常处理),以及IDoc连接配置(端口、税务系统源码伙伴参数和处理代码设定)。还涉及了IDoc开发、管理、测试及归档工具。

       第5章 工作流设计和实现

       本章节探讨了SAP工作流的基本概念、整体架构、示例以及业务工作台的用户工作环境。详细介绍了工作流系统定制、工作流设计器及创建实例,包括通过Workflow Builder新建工作流模板、添加标准任务、邮件功能、用户决定和循环控制,以及工作流与业务对象、组织结构模型、任务启动与结束等。

       第6章 外部编程接口:RFC API和SAP连接器

       本章解释了RFC API和SAP连接器(JCo、NCo、业务连接器)的基本概念、客户端和服务器编程、回调特征、事务性RFC、外部程序之间的RFC、以及外部编程接口的安装、配置和调试。

       第7章 SAP NetWeaver Portal开发

       本章节对SAP NetWeaver Portal的开发进行综述,包括Portal概述、应用程序的开发途径、技术属性、开发SAP BSP和Web Dynpro、以及开发SAP Web服务的详细指南。

扩展资料

       本书内容丰富,涵盖了SAP系统实施、集成过程中的众多技术专题,包括RFC通信协议、业务对象和BAPI 的刷单大厅源码创建与应用、ALE/IDoc技术及实现、SAP工作流系统设定与实例、SAP连接器以及Portal应用程序开发等内容。这些专题概念叙述清晰明确,且均给出了详尽的实现实例,并附有完整源代码,有助于读者的深入理解。

密码学开源库整理

       密码学开源库整理

       维护一个密码学开源列表,旨在促进大家的共同学习与交流。持续更新中,欢迎投稿,贡献宝贵的资源。

       基础密码库

       C/C++

       MIRACL Crypto SDK- 一个广泛认可的多精度整数和有理数加密库,被视作椭圆曲线密码学的黄金标准。

       OpenSSL- 用于传输层安全协议的健壮、商业级、功能齐全的开源工具包。

       Tongsuo (原BabaSSL)- 提供现代密码学算法和安全通信协议的开源基础库,适用于各种业务场景。

       NTL- 高性能、可移植的C++库,提供整数、向量、矩阵、多项式和浮点运算的数据结构和算法。

       cryptoPP- 一个开源C++密码学库,包含了众多密码算法。

       PBC- 一个基于GMP库的免费C库,用于执行基于配对的密码系统的数学运算。

       NaCl- 一个易于使用的高效密码库,专为网络通信、加密、解密、签名等设计。

       Sodium- NaCl的一个分支,具有兼容和扩展API,有软件的源码提供构建更高级加密工具所需的核心操作。

       RELIC- 一个面向研究的现代密码原语工具箱,强调效率和灵活性。

       OpenABE- 集成了各种基于属性的加密算法、行业标准加密功能和工具,易于使用。

       cpabe toolkit- 实现基于密文策略的属性加密方案的程序,使用PBC库进行代数运算。

       Paillier- 公钥密码系统,提供加法同态性,适用于保护隐私的应用。

       代理重新加密- 公钥加密的一种形式,允许用户将其解密权委托给另一个用户。

       BGW广播加密- 允许广播者向一组接收者发送加密信息的方案。

       JAVA

       The Java Pairing-Based Cryptography Library (JPBC)- 一个开源密码工具箱,支持国密算法、数字证书和SSL/TLS安全通信协议。

       Python

       pyUmbral- Umbral阈值代理重新加密方案的参考实现,支持密文委托。

       Golang

       The Go Pairing-Based Cryptography Library- 提供不同SOTA函数式加密方案的实现。

       CONIKS- 一个密钥管理系统,提供终端用户加密密钥的透明度和隐私保护。

       隐私增强技术库

       mpc和FHE库- 包括ecc、paillier、elgamal等基础公钥密码算法。

       区块链与零知识证明

       Rust/C++库- 实现zkSNARK方案的零知识证明系统。

       量子安全密码

       liboqs- 一个开放源码C库,包含量子安全加密算法的开源实现。

       可搜索加密

       收集的可搜索加密列表。

       隐私保护机器学习

       收集的Secure Deep Learning代码库列表。

       贡献者:

什么是ECC内存?

       ECC内存是带ECC校正的内存

       ECC是“Error Checking and Correcting”的简写,中文名称是“错误检查和纠正”。ECC是一种能够实现“错误检查和纠正”的技术,ECC内存就是应用了这种技术的内存,一般多应用在服务器及图形工作站上,这将使整个电脑系统在工作时更趋于安全稳定。discuz x论坛源码

       要了解ECC技术,就不能不提到Parity(奇偶校验)。在ECC技术出现之前,内存中应用最多的是另外一种技术,就是Parity(奇偶校验)。我们知道,在数字电路中,最小的数据单位就是叫“比特(bit)”,也叫数据“位”,“比特”也是内存中的最小单位,它是通过“1”和“0”来表示数据高、低电平信号的。在数字电路中8个连续的比特是一个字节(byte),在内存中不带“奇偶校验”的内存中的每个字节只有8位,若它的某一位存储出了错误,就会使其中存储的相应数据发生改变而导致应用程序发生错误。而带有“奇偶校验”的内存在每一字节(8位)外又额外增加了一位用来进行错误检测。比如一个字节中存储了某一数值(1、0、1、0、1、0、1、1),把这每一位相加起来(1+0+1+0+1+0+1+1=5)。若其结果是奇数,对于偶校验,校验位就定义为1,反之则为0;对于奇校验,则相反。当CPU返回读取存储的数据时,它会再次相加前8位中存储的数据,计算结果是否与校验位相一致。当CPU发现二者不同时就作出视图纠正这些错误,但Parity有个缺点,当内存查到某个数据位有错误时,却并不一定能确定在哪一个位,也就不一定能修正错误,所以带有奇偶校验的内存的主要功能仅仅是“发现错误”,并能纠正部分简单的错误。

       通过上面的分析我们知道Parity内存是通过在原来数据位的基础上增加一个数据位来检查当前8位数据的正确性,但随着数据位的增加Parity用来检验的数据位也成倍增加,就是说当数据位为位时它需要增加2位用于检查,当数据位为位时则需增加4位,依此类推。特别是当数据量非常大时,数据出错的几率也就越大,对于只能纠正简单错误的奇偶检验的方法就显得力不从心了,正是基于这样一种情况,一种新的内存技术应允而生了,这就是ECC(错误检查和纠正),这种技术也是在原来的数据位上外加校验位来实现的。不同的是两者增加的方法不一样,这也就导致了两者的主要功能不太一样。它与Parity不同的是如果数据位是8位,则需要增加5位来进行ECC错误检查和纠正,数据位每增加一倍,ECC只增加一位检验位,也就是说当数据位为位时ECC位为6位,位时ECC位为7位,数据位为位时ECC位为8位,依此类推,数据位每增加一倍,ECC位只增加一位。总之,在内存中ECC能够容许错误,并可以将错误更正,使系统得以持续正常的操作,不致因错误而中断,且ECC具有自动更正的能力,可以将Parity无法检查出来的错误位查出并将错误修正。

       2 ECC(Elliptic Curve Cryptosystems )椭圆曲线密码体制

       年,美国SUN公司将其开发的椭圆加密技术赠送给开放源代码工程

       公钥密码体制根据其所依据的难题一般分为三类:大整数分解问题类、离散对数问题类、椭圆曲线类。有时也把椭圆曲线类归为离散对数类。

       椭圆曲线密码体制来源于对椭圆曲线的研究,所谓椭圆曲线指的是由韦尔斯特拉斯(Weierstrass)方程:

       y2+a1xy+a3y=x3+a2x2+a4x+a6 (1)

       所确定的平面曲线。其中系数ai(I=1,2,…,6)定义在某个域上,可以是有理数域、实数域、复数域,还可以是有限域GF(pr),椭圆曲线密码体制中用到的椭圆曲线都是定义在有限域上的。

       椭圆曲线上所有的点外加一个叫做无穷远点的特殊点构成的集合连同一个定义的加法运算构成一个Abel群。在等式

       mP=P+P+…+P=Q (2)

       中,已知m和点P求点Q比较容易,反之已知点Q和点P求m却是相当困难的,这个问题称为椭圆曲线上点群的离散对数问题。椭圆曲线密码体制正是利用这个困难问题设计而来。椭圆曲线应用到密码学上最早是由Neal Koblitz 和Victor Miller在年分别独立提出的。

       椭圆曲线密码体制是目前已知的公钥体制中,对每比特所提供加密强度最高的一种体制。解椭圆曲线上的离散对数问题的最好算法是Pollard rho方法,其时间复杂度为,是完全指数阶的。其中n为等式(2)中m的二进制表示的位数。当n=, 约为,需要1.6x MIPS 年的时间。而我们熟知的RSA所利用的是大整数分解的困难问题,目前对于一般情况下的因数分解的最好算法的时间复杂度是子指数阶的,当n=时,需要2xMIPS年的时间。也就是说当RSA的密钥使用位时,ECC的密钥使用位所获得的安全强度还高出许多。它们之间的密钥长度却相差达9倍,当ECC的密钥更大时它们之间差距将更大。更ECC密钥短的优点是非常明显的,随加密强度的提高,密钥长度变化不大。

       德国、日本、法国、美国、加拿大等国的很多密码学研究小组及一些公司实现了椭圆曲线密码体制,我国也有一些密码学者做了这方面的工作。许多标准化组织已经或正在制定关于椭圆曲线的标准,同时也有许多的厂商已经或正在开发基于椭圆曲线的产品。对于椭圆曲线密码的研究也是方兴未艾,从ASIACRYPTO’上专门开辟了ECC的栏目可见一斑。

       在椭圆曲线密码体制的标准化方面,IEEE、ANSI、ISO、IETF、ATM等都作了大量的工作,它们所开发的椭圆曲线标准的文档有:IEEE P Pa、ANSI X9. X9.、 ISO/IEC等。

       年5月日中国颁布的无线局域网国家标准 GB. 中,包含了全新的WAPI(WLAN Authentication and Privacy Infrastructure)安全机制,能为用户的WLAN系统提供全面的安全保护。这种安全机制由 WAI和WPI两部分组成,分别实现对用户身份的鉴别和对传输的数据加密。WAI采用公开密钥密码体制,利用证书来对WLAN系统中的用户和AP进行认证。证书里面包含有证书颁发者(ASU)的公钥和签名以及证书持有者的公钥和签名,这里的签名采用的就是椭圆曲线ECC算法。

       加拿大Certicom公司是国际上最著名的ECC密码技术公司,已授权多家企业使用ECC密码技术,包括Cisco 系统有限公司、摩托罗拉、Palm等企业。Microsoft将Certicom公司的***嵌入微软视窗移动系统中。

       ECC :engine control center发动机控制中心,主要适用于民航

       ECC :ERP Central Componet, 企业资源计划核心组件(参考资源SAP教程)

       3 ECC: Embedded Control Channel 嵌入控制信道

        SDH网络中的ECC是传送操作、管理和维护(OAMP)信息的逻辑信道。它以SDH中的数据通信信道(DCC)作为其物理通路。SDH ECC 协议栈是以OSI参考模型为基础的,协议的设计方法与当前管理系统的面向对象是一致的。ECC协 议栈的应用层包含公共管理信息服务单元(CMISE),还包含支持CMICE的远程操作服务单元(ROSE)和联系控制服务单元(ACSE)。表示层、会 话层和传送层提供支持ROSE和ACSE所需的面向连接的服务。其中传送层还包括附加协议单元,使得在由无连接网络层协议(CLNP)操作时可提供连接模 式服务。数据链路层采用Q.和Q.中所规定的D信道链路接入程序(LAPD),物理通路采用SDH DCC

中国当年的winXP盗版系统是谁做出来的? - 知乎

       Windows XP激活方式包括VOL、OEM和零售三种。

       VOL密钥(VLK)是大客户密钥,理论上无限次使用,无需联网即可激活。公开的VLK被泄露后,微软通过更新包屏蔽,中国也对微软施压,导致部分用户中了黑屏问题。

       破解补丁直接替换pidgen.dll,绕过激活逻辑,但更新可能覆盖为正版。Windows7推出后,微软停止了XP的大补丁支持。

       OEM激活在主板ACPI表中加入SLIC表,但这种方式在Windows7盗版中广泛应用。UEFI之后,这种方式使用减少。

       零售激活早期用于盗版Windows XP,通过算号器实现。算号器纯离线操作,原理基于ECC加密算法。

       ECC算法在Windows XP发布前被详细介绍,用于验证激活码。该算法包含在pidgen.dll中,通过暴力破解可获得私钥。Windows XP电话激活服务关闭后,有人创建了产品ID到应答ID模拟器,揭示了算号器的历史。

       最早的算号器MSKey在至年间出现,源码于年在GitHub上传。最初的发布地点是AntiWPA论坛,由z发布。用户diamondggg逆向了从安装ID到应答ID的算法,完整破解了Windows XP激活过程。算号器的算法同样适用于Windows 、Office等产品,甚至生成Office 、Windows Embedded POSReady 和Halo: Combat Evolved的密钥。

       随后,算号器算法被集成到C++项目中,并有Rust重写版。此项目被编译为WebAssembly,发布在网页上。

求一个基于openssl写的ecc曲线的源代码

       下面的例子生成两对ECC密钥,并用它做签名和验签,并生成共享密钥。

       #include <string.h>

       #include <stdio.h>

       #include <openssl/ec.h>

       #include <openssl/ecdsa.h>

       #include <openssl/objects.h>

       #include <openssl/err.h>

       int main()

       {

        EC_KEY *key1,*key2;

        EC_POINT *pubkey1,*pubkey2;

        EC_GROUP *group1,*group2;

        int ret,nid,size,i,sig_len;

        unsigned char*signature,digest[];

        BIO *berr;

        EC_builtin_curve *curves;

        int crv_len;

        char shareKey1[],shareKey2[];

        int len1,len2;

        /* 构造EC_KEY数据结构 */

        key1=EC_KEY_new();

        if(key1==NULL)

        {

        printf("EC_KEY_new err!\n");

        return -1;

        }

        key2=EC_KEY_new();

        if(key2==NULL)

        {

        printf("EC_KEY_new err!\n");

        return -1;

        }

        /* 获取实现的椭圆曲线个数 */

        crv_len = EC_get_builtin_curves(NULL, 0);

        curves = (EC_builtin_curve *)malloc(sizeof(EC_builtin_curve) * crv_len);

        /* 获取椭圆曲线列表 */

        EC_get_builtin_curves(curves, crv_len);

        /

*

        nid=curves[0].nid;会有错误,原因是密钥太短

        */

        /* 选取一种椭圆曲线 */

        nid=curves[].nid;

        /* 根据选择的椭圆曲线生成密钥参数group */

        group1=EC_GROUP_new_by_curve_name(nid);

        if(group1==NULL)

        {

        printf("EC_GROUP_new_by_curve_name err!\n");

        return -1;

        }

        group2=EC_GROUP_new_by_curve_name(nid);

        if(group1==NULL)

        {

        printf("EC_GROUP_new_by_curve_name err!\n");

        return -1;

        }

        /* 设置密钥参数 */

        ret=EC_KEY_set_group(key1,group1);

        if(ret!=1)

        {

        printf("EC_KEY_set_group err.\n");

        return -1;

        }

        ret=EC_KEY_set_group(key2,group2);

        if(ret!=1)

        {

        printf("EC_KEY_set_group err.\n");

        return -1;

        }

        /* 生成密钥 */

        ret=EC_KEY_generate_key(key1);

        if(ret!=1)

        {

        printf("EC_KEY_generate_key err.\n");

        return -1;

        }

        ret=EC_KEY_generate_key(key2);

        if(ret!=1)

        {

        printf("EC_KEY_generate_key err.\n");

        return -1;

        }

        /* 检查密钥 */

        ret=EC_KEY_check_key(key1);

        if(ret!=1)

        {

        printf("check key err.\n");

        return -1;

        }

        /* 获取密钥大小 */

        size=ECDSA_size(key1);

        printf("size %d \n",size);

        for(i=0;i<;i++)

        memset(&digest[i],i+1,1);

        signature=malloc(size);

        ERR_load_crypto_strings();

        berr=BIO_new(BIO_s_file());

        BIO_set_fp(berr,stdout,BIO_NOCLOSE);

        /* 签名数据,本例未做摘要,可将digest中的数据看作是sha1摘要结果 */

        ret=ECDSA_sign(0,digest,,signature,&sig_len,key1);

        if(ret!=1)

        {

        ERR_print_errors(berr);

        printf("sign err!\n");

        return -1;

        }

        /* 验证签名 */

        ret=ECDSA_verify(0,digest,,signature,sig_len,key1);

        if(ret!=1)

        {

        ERR_print_errors(berr);

        printf("ECDSA_verify err!\n");

        return -1;

        }

        /* 获取对方公钥,不能直接引用 */

        pubkey2 = EC_KEY_get0_public_key(key2);

        /* 生成一方的共享密钥 */

        len1=ECDH_compute_key(shareKey1, , pubkey2, key1, NULL);

        pubkey1 = EC_KEY_get0_public_key(key1);

        /* 生成另一方共享密钥 */

        len2=ECDH_compute_key(shareKey2, , pubkey1, key2, NULL);

        if(len1!=len2)

        {

        printf("err\n");

        }

        else

        {

        ret=memcmp(shareKey1,shareKey2,len1);

        if(ret==0)

        printf("生成共享密钥成功\n");

        else

        printf("生成共享密钥失败\n");

        }

        printf("test ok!\n");

        BIO_free(berr);

        EC_KEY_free(key1);

        EC_KEY_free(key2);

        free(signature);

        free(curves);

        return 0;

       }