对比一下ecdsa与secp256k1-py从私钥生成公钥

在前文secp256k1-py 安装以及命令行操作中,我们介绍了secp256k1-py这个Python 库。

我们可以使用这个库用简单的命令行进行公钥私钥对的生成,以及对消息进行签名、校验等操作。


(图源 :pixabay)

而在以前的学习中,我们曾经用ecdsa这个Python库来从私钥生成公钥,这节我们回顾一下这些知识,并对比一下ecdsa与secp256k1-py从私钥生成公钥的异同。

生成私钥

在之前的文章中,我们曾经说过,私钥就一串随机数,可以用抛硬币256次来生成。不过估计没谁会无聊到这种程度,所以在之前的文章中,我们用hashlib来生成私钥。

1
2
3
4
import hashlib
from binascii import hexlify, unhexlify
s = hashlib.sha256(bytes('Hello World', 'utf-8')).digest()
print(hexlify(s).decode('ascii'))

上述代码生成如下私钥:

a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e

我们也可以使用
python -m secp256k1 privkey
来生成私钥,但是程序员嘛,对Hello World情有独钟,所以就用我们上边用Hello World生成的私钥好了。

生成公钥

在之前的文章中,我们得出过结论,公钥可以通过K=k∗G计算得出,
其中小k是我们的私钥G生成点K是结果亦即公钥曲线上的另外一个点

另外,由于对于点P(x, y),根据椭圆曲线的方程,我们是可以通过x求得y的,所以公钥可以压缩表示。

ecdsa由私钥生成公钥

在之前的文章中,我们最终得出如下代码:

1
2
3
4
5
6
7
8
9
10
11
import ecdsa
from binascii import hexlify, unhexlify
secret = unhexlify('a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e')
order = ecdsa.SigningKey.from_string(secret, curve=ecdsa.SECP256k1).curve.generator.order()
p = ecdsa.SigningKey.from_string(secret, curve=ecdsa.SECP256k1).verifying_key.pubkey.point
x_str = ecdsa.util.number_to_string(p.x(), order)
y_str = ecdsa.util.number_to_string(p.y(), order)
compressed = hexlify(bytes(chr(2 + (p.y() & 1)), 'ascii') + x_str).decode('ascii')
uncompressed = hexlify(bytes(chr(4), 'ascii') + x_str + y_str).decode('ascii')
print(compressed)
print(uncompressed)

输出如下:

secp256k1-py 命令行生成公钥

我们可以通过以下指令从私钥生成公钥:
python -m secp256k1 privkey -p -k a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e

生成的压缩公钥和上边我们用ecdsa生成的完全一致。

secp256k1-py 代码生成公钥

1
2
3
4
5
6
7
from secp256k1 import PrivateKey
from binascii import hexlify, unhexlify
privkey = PrivateKey(unhexlify('a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e'))
compressed = hexlify(privkey.pubkey.serialize()).decode('ascii')
uncompressed = hexlify(privkey.pubkey.serialize(compressed=False)).decode('ascii')
print(compressed)
print(uncompressed)

输出如下:

可见和ecdsa生成的公钥完全一致。

结论

在程序中使用secp256k1-py可以更快捷地从私钥生成公钥,代码也更易于阅读和理解。

但是同样因为secp256k1-py的公钥生成逻辑和细节对用户完全透明,要学习相关知识的话,还是用ecdsa更好一些。

相关文章


This page is synchronized from the post: 对比一下ecdsa与secp256k1-py从私钥生成公钥

渣渣程序员随便聊聊自己学过的编程语言(下)

昨天前天的帖子中聊了以前接触过的一些程序语言,今天来继续吹牛逼闲扯淡。


(图源 :pixabay)


Shell脚本

如果看过我之前帖子的朋友,可能会知道我在Linux系统下工作了好长一段时间,参与过IDS、IPS、防火墙等诸多产品的开发和维护。而这些工作除了和C语言打交道以外,最常用工具就是Shell脚本了。比如说裁剪Linux的内核、生成最小系统、制作安装脚本等等。

为了胜任这些工作,我狂啃了一段时间Shell开发,什么awk、sed乱七八糟的工具我用得炉火纯青。

最开始玩steem的时候,还不知道有python库,只知道有命令行工具。为了做些好玩的东西,我把抛弃了好多年的Shell编程捡了起来,玩得不亦乐乎。

比如在使用OLED液晶屏实时显示你的STEEM资产/Use the OLED screen to display your STEEM assets in real time这个帖子中,为了简化数据,我用如下代码处理数据:

~/.local/bin/piston --node wss://steemit.com/wspa balance abit | sed -e '/^+/d' | sed -e '/Account/d' | awk -F " " '{ print $2 " " $4 " " $7 " " $13}'

现在看起来,傻的不要不要的。

Lua

Lua也曾是我工作中最重要的伙伴。

在我的开发生涯中,曾经遇到过这样一组需求,将很多繁琐的人工工作自动完成。

比如说我们给一款电路板上的芯片下载固件,那么我们需要连接好电路板,然后根据芯片类型选择对应的下载工具,然后再根据固件的版本等选择对应的固件,再一步一步去执行擦除、下载、校验等工作。当时我们用到的电路板型号特别多,涉及到的下载工具也有好多款,固件版本更是相当混乱。

为了解决这个问题,我主持设计和开发了一个全自动的工具(除了连接硬件),用户链接好硬件后,程序会自动读取对应芯片的信息,然后根据板卡和芯片类型,自动启动对应的下载工具,自动加载文件,鼠标自动点击,一步步完成。

因为不同的下载工具,操作的步骤是不一样的,所以我设计了一门脚本语言,可以启动软件、选择菜单、点击按钮、输入和读取文本框等操作,而实现原理就是我在C++程序中集成了lua虚拟机,可以将对应的脚本读取进来然后通过C++去实现。

前些天去看了一眼Lua的官网,发现好几年没新版本释出了。而我,除了会写Hello World以外,也不会写什么了。

Python

其实工作以后,大多时候我都是用PHP和C++,包括后来在家给国外一家公司打工,都是用的C++。但是后来这个公司丢给我一个项目,用我们自己的模拟软件生成一堆数据,然后用这堆数据生成化合物的结构图。

而且为了让对方公司那边使用方便,需要用Python实现,这是我第一次使用Python开发。为了完成这个任务,我买了《Python编程第四版(影印版)》上下两册,一遍读书一边在网站上学习和查手册,最终终于完美的完成了这个项目。

那之后我用Python写了一些服务器日志分析之类的小脚本,就再也没接触过Python了。直到玩steem和bitshares才重新捡了起来,不过与其说捡起来,不如说重新学,毕竟举例以前接触Python代码已经过了五六年了。原本我以为再也不会用到呢,这世上的事谁又能说得清楚呢。

还是这个公司,后来又让我去改写一些科学计算方面的Fortran代码,每天和老外沟通如何用Fortran实现一个又一个功能,那段日子,苦不堪言啊。

其它

除了上述语言和工具外,其实还接触过好多语言,比如为了给IDS开发一个SNMP管理工具,特意学了一些Delphi 7编程,为了写些小恶意脚本入侵朋友和同事电脑特意学的javascipts和vbs(啥,我啥时候干过这事)至于Jave程序设计教程至今仍摆在我的书架上,哦,我曾经还会用Flash写程序。



(图源 :pixabay)

总之,乱七八糟的东西学了不少,接触了不少。但是说到精通,可能没有那门算精通吧。用一句话形容,就是样样通样样松,不过精不精通又何妨呢,至少我觉得学习、应用过这些语言和工具,让我曾经的生命更加精彩,这就足矣。

全文完

相关文章


This page is synchronized from the post: 渣渣程序员随便聊聊自己学过的编程语言(下)

secp256k1-py 安装以及命令行操作

阅读steem-python代码时发现了secp256k1-py 这个库。官方介绍是:

Python FFI bindings for libsecp256k1(an experimental and optimized C library for EC operations on curve secp256k1).

简单来讲就是专门用于曲线secp256k1椭圆曲线操作的C库libsecp256k1的Python FFI(foreign function interface)绑定。很拗口是吧,没办法,水平有限😳


(图源 :pixabay)

安装

原本以为安装会很简单,但是实际安装时却出了一些问题,现记录如下。

安装指令

官方提供的不使用预先编译好的库的安装方法为:
pip install --no-binary secp256k1

我执行上述指令,提示:

You must give at least one requirement to install (see “pip help install”)

在这个网页中,学习到–no-binary 选项后应该跟格式控制
https://pip.pypa.io/en/stable/reference/pip_install/#install-no-binary
--no-binary <format_control>

所以上述指令应为:
pip install --no-binary :all: secp256k1

当然如果图省事,直接执行下列指令就行了
pip install secp256k1
反正对我而言是没啥区别。

但是,这就完事了吗?NO,安装还是出了一堆问题,见招拆招吧。

'pkg-config' is required

出错信息:

‘pkg-config’ is required to install this package. Please see the README for details.

解决方法:
安装pkg-config
sudo apt-get install pkg-config

autoreconf: not found

出错信息:

/tmp/pip-build-ar3agy47/secp256k1/libsecp256k1/autogen.sh: 3: /tmp/pip-build-ar3agy47/secp256k1/libsecp256k1/autogen.sh: autoreconf: not found

解决方法:
安装autoconf
sudo apt-get install autoconf

'LIBTOOL' is undefined

出错信息:

Makefile.am:3: error: Libtool library used but ‘LIBTOOL’ is undefined

解决方法:
安装LIBTOOL
sudo apt-get install libtool

可能还需要一些依赖,但可能我的系统中已经安装有对应的包或者库,就没提示,所以朋友们如果安装遇到问题,需要自己仔细查看出错信息,从出错信息中找出需要的内容。

命令行使用

废了九牛二虎之力,总算把这个东东装上了,然后让我们来试试它的威力吧。

生成私钥和公钥

命令如下:
python -m secp256k1 privkey -p

c6e193266883a500c6e51a117e012d96ad113d5f21f42b28eb648be92a78f92f
Public key: 0314bf901a6640033ea07b39c6b3acb675fc0af6a6ab526f378216085a93e5c7a2

这速度,嗷嗷快啊,看来我可以考虑生成荣耀地址了。

消息签名

消息签名就是使用私钥对文本信息进行签名

1
2
3
python -m secp256k1 sign \
-k c6e193266883a500c6e51a117e012d96ad113d5f21f42b28eb648be92a78f92f \
-m hello

其中私钥为我们之前生成的私钥,明文消息为hello
最终生成的签名为:

3045022100a314a579fb9f30a804c172eec4881ed603e661eed692797149dfdbce24d671d202203ccfab0603ad97c34864caa22d42a24d0cb5750fcb159476b8ae30a11edc0ed6

校验签名

校验签名就是使用使用消息、公钥、签名,来校验签名是否是公钥对应的私钥所签发

1
2
3
4
python -m secp256k1 checksig \
-p 0314bf901a6640033ea07b39c6b3acb675fc0af6a6ab526f378216085a93e5c7a2 \
-m hello \
-s 3045022100a314a579fb9f30a804c172eec4881ed603e661eed692797149dfdbce24d671d202203ccfab0603ad97c34864caa22d42a24d0cb5750fcb159476b8ae30a11edc0ed6

以上指令执行后返回结果为:True,表示校验通过

生成可恢复公钥的签名

1
2
3
python -m secp256k1 signrec \
-k c6e193266883a500c6e51a117e012d96ad113d5f21f42b28eb648be92a78f92f \
-m hello

最终生成的签名如下:

a314a579fb9f30a804c172eec4881ed603e661eed692797149dfdbce24d671d23ccfab0603ad97c34864caa22d42a24d0cb5750fcb159476b8ae30a11edc0ed6 0

从签名中恢复公钥

1
2
3
4
python -m secp256k1 recpub \
-s a314a579fb9f30a804c172eec4881ed603e661eed692797149dfdbce24d671d23ccfab0603ad97c34864caa22d42a24d0cb5750fcb159476b8ae30a11edc0ed6 \
-i 0\
-m hello

最终我们恢复出来的公钥为:

Public key: 0314bf901a6640033ea07b39c6b3acb675fc0af6a6ab526f378216085a93e5c7a2

总结

本文介绍secp256k1-py 的安装以及命令行操作。

因为libsecp256k1是专门为secp256k1曲线实现的C库,而secp256k1-py是libsecp256k1的FFI绑定,所以那操作速度是杠杠滴。

本文只是略作探索,之后我们会进一步学习secp256k1-py。

相关链接


This page is synchronized from the post: secp256k1-py 安装以及命令行操作

渣渣程序员随便聊聊自己学过的编程语言(中)

在[昨天的帖子中]聊了以前接触过的一些程序语言,今天来继续吹牛逼闲扯淡。


(图源 :pixabay)

Lisp

话说尽管PHP曾一度让我着迷,但是当我遇到LISP的时候,我一下子彻底沦陷了。世界上居然还有这么变态的语言。

接触Lisp到不是我主动学习,而是遇到一个实际项目,一个激光切割加工厂使用的激光切割控制系统有一些问题急需解决,希望我们能帮他们摆平。别看现在遍地都是激光切割加工企业,甚至于好多淘宝店都可以来样加公,但是放到十几年前,激光切割还算是了不得的事物呢。拿到项目的部分代码,我一看傻眼了,这是什么鬼啊,后来总算搞明白这是Lisp,于是去图书馆狂啃好几天Lisp语言的书,白天黑夜甚至吃饭走路都在想怎么实现对方的需求,最后终于不负所望,解决掉了所有的问题。

那之后,我知道Lisp是一种神奇的语言,但是以后工作中再也没有遇到,以至于到现在,我拿出代码发现我竟然一行也看不懂了。

BREW

严格意义上讲,BREW算不得一门语言,但是它曾经是我程序员生涯中最最重要的一部分,我甚至以为凭借这门语言我可以一飞冲天,然而随着这个东西的没落,我终归没能飞得起来。

BREW全称Binary Runtime Environment for Wireless(无线二进制运行环境),是2003年前后高通(Qualcomm)大力推广的东西,当时京瓷、索尼爱立信以及中国联通都跟进支持。简单得来讲,就是在那时候手机CPU、屏幕、以及内存等资源都受限的情况下,让手机可以跑程序。

在BREW还在襁褓中时,我就被公司要求对BREW进行调研。这让我一不小心成了这方面的砖家,后来公司和索爱等合作BREW相关的业务,我当仁不让地担任了技术骨干和相关团队的负责人。而我也因此结识了很多这方面的国外内权威,混到那个圈子里,大家当时一起做网站一起谋划出书,好不热闹。当时网站名叫移动未来,域名叫Move2008,对于2003年前后的我们而言,2008是多么遥远的未来啊。

可惜世界变化太快,BREW最终没能火起来,现在2008已经过去了十年,当年的未来,都已变成了过去,一声叹息。

GSM / SMS

BREW上折戟沉沙以后,我又转战了一个崭新的领域,没错,就是手机系统开发。和现在的IOS和安卓开发不同,我们开发的是手机系统。可以简单地理解为我们做安卓或者IOS系统本身,当然了照比现在精致的安卓和IOS,我们那时候做的东西就是不堪入目。

当时我负责GSM和SMS部分,为了把这块弄好,我可是下了大功夫,每日狂啃ETSI的各种标准文档。以往有些媒体形容一些人搞科研,看过的文档几米高,觉得甚为夸张,但是为了啃ETSI的文档,我打印出来并仔细阅读和批注的东西,真的至少有一尺多了。现在我家里还保留着部分文档,有时候拿出来一看,恍然如梦,当时是凭借怎样一种冲劲去啃的,现在想想都很难理解。

掌握了GSM/SMS的标准之后,我在我们的手机系统上实现了相关功能,不过当时也闹过好多笑话,这里就不提了。后来项目惨淡收尾,我学的东西又白学了。再后来自己做了一些好玩的东西,可惜一次酒后重装系统,源代码等通通消失,之后我大醉一场。



(图源 :pixabay)

咦,今天聊的好像不是语言啊,哦,只有Lisp算。不过既然一口气啰嗦了这么多,我也不能删了重写,那就这样吧,反正也没几个人看。


This page is synchronized from the post: 渣渣程序员随便聊聊自己学过的编程语言(中)

发帖庆祝一下,我的ETH终于回来了

在之前的曾经不止一次遇到Openledger卡币,不过卡啊卡的,已经习惯了,后来转账之前,先看看Openledger有没有公告说哪个币种网关关掉等等。


(图源 :pixabay)

ETH 被卡

这些天不是ETH行情大好嘛,想到我在poloniex还有多达1个ETH的巨款,我得赶紧弄出来套现买大米啊。

于是乎在比特股内盘获得的OPEN.ETH的充值地址,在poloniex提交了提现申请,所有操作行云流水、一气呵成,然后就耐心地等OPEN.ETH到账了。

结果等啊等啊,等啊等啊,我等了一个又一个小时,我的ETH也没到账。然而看poloniex的提现记录,明明显示已经成功了啊?

找了一个ETH的区块链浏览器,从poloniex的提现记录找到transaction id,进去一查,明明ETH很久以前就进入到Openledger分配的地址!

发Ticket 求助

忍了大半天之后忍无可忍,去https://openledger.freshdesk.com发了个ticket问了一下我的ETH为何没有到账?结果过了一天没人理会,然后再次Update了一条问是否有所进展,然后大半天之后也就是6天以前终于给我一个没有任何意义的格式化回应

于是我每天不停地追问,3天以前给了这样一个答复

但是我不能理解的有几点:

  • 我操作的时候(3、4天以前)网关是正常的,没有停掉
  • 我的ETH早已到了Openledger生成的ETH地址,和拥堵有关系吗?

ETH终回来

不过,既然人家告诉我等就耐心的等呗,直到看到网页钱包中ETH冲提接口已经恢复,我的ETH还没到账。不过我的心已经麻木了,对他们已经不抱有任何指望了,也懒得去发ticket追问和催促了。大不了,我先少吃几顿大米。


早晨习惯性刷钱包,咦,怎么多出来近一个ETH,仔细一看记录,OpenLedger终于把我的OPEN.ETH充值上了。谢天谢地,谢谢OpenLedger,在历时一个多星期之后,我终于看到了我的ETH。

我觉得应该给OpenLedger发一面锦旗,表达我的感激之情,然而锦旗做好了也不知道该寄到哪里去,那么就发个帖子感谢一下吧。

相关链接


This page is synchronized from the post: 发帖庆祝一下,我的ETH终于回来了

渣渣程序员随便聊聊自己学过的编程语言(上)

在以往的武侠小说中,形容一个武林高手,往往都会说到十八般武艺样样精通。而在程序猿的世界,这句话往往就变成了哇,他会好多种语言啊

没错,我曾经就是这种会好多语言的一枚程序员。现在说自己什么什么语言,自己都脸红,不过诸位看官也别较真,这里所谓的会,就是接触过啦


(图源 :pixabay)

Autoexec.bat & QBasic

最开始接触电脑的时候,我就开始尝试用自动批处理脚本来修改机房电脑的开机提示,用来戏弄好朋友。然后接触了QBasic我才知道居然还有一种东西叫做编程语言,这明显比计算器先进多了。

经典谭C

在初步学会了QBasic之后,我接触到了C语言,一下子就被它简洁高效所吸引。当时花大价钱买的《C语言编程——谭浩强》我还一直收藏呢,尽管后来网上诸路大神对这本书褒贬不一,但是对我而言,他无疑是引导我步入程序殿堂的圣经。

汇编、Fortran、Keil C

接触了C语言之后,我又学习了汇编语言、Fortran语言。汇编语言除了学习了8086系统上的,还学习了51单片机上的汇编语言。我用汇编语言在PC机上写过键盘记录程序,那时候还不太了解什么病毒啊木马之类的概念,就觉得这么做似乎挺好玩的。51单片机上的汇编语言在我们创业期间曾经好长一段时间是我们工作的主要工具,知道后来有了Keil C。至于Fortran我一直以为它是一个打酱油的,可是没想到后来还用了好长一段时间。

Foxbase&Foxpro、 SQL

在这期间,还学习foxbase以及foxpro关系数据库系统,也算是第一次接触了数据库的概念以及SQL语言吧。那时候没事就练手写神马学籍管理系统,期末考试成绩管理系统、图书馆图书管理系统。不过多大的程序,冠名系统总显得特别高大山不是嘛。至于MYSQL则是后来学习PHP的时候才算正式接触到。

VB、ASP

在这之后,接触了VB,那些曾经认为很神奇的桌面程序,再无神秘感可言。拖拽几下加上几行代码,瞬间一个可执行程序就出来了。然后我用VB切切实实地做过了好多程序,比如之前文章中提到的编程器,再比如群发邮件工具(我没用来SPAM啊)、还有和messenger服务结合开发的用与内网的聊天工具,以及和TTS结合的文本阅读器等等等等

在这之后,全世界都在流行建站,没有一个自己的网站都不好意思和朋友打招呼,那时候最流行的莫过于ASP了,于是撸起袖子就开学,发现这不就是VB嘛,超级简单啊。用ASP搞过一些小站之后,突然兴趣索然,觉得不过如此。

PHP

结果有一天突然听到一个新鲜的语言,叫PHP,哇哇哇,这个语言太精致了,太优雅了,这不就是C语言嘛。那时国内有个网站叫奥索网,也叫开放源代码在线,可以通过共享代码和写一些教程的方式获得PHP+MYSQL空间,于是为了空间,写了好多教程。现在回头想想,竟然和为了钱在STEEMIT上写文章有些类似。

PHP学会了以后,做留言本、做论坛、做群发邮件程序(囧,怎么又是群发邮件),哎,其实我真的没用来SPAM,我只是把我的好友邮件和昵称整理出一个列表。然后我以后再也不用给每个朋友单独写邮件了,只要写好一份内容,我的程序自动将昵称加上,然后发送给我诸多好友,导致我的好友们非常感动,有不少回信都感动哭了。



(图源 :pixabay)

所以说嘛,学编程还是有大用途的!难道不是嘛?另外,谁还说PHP不是世界上最好的语言?能把人感动哭的,难道还不是足够好吗?

未完待续,敬请期待


This page is synchronized from the post: 渣渣程序员随便聊聊自己学过的编程语言(上)

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×