继续探索python-bitshares的Memo类 / Pub(Alice) * Priv(Bob) = Pub(Bob) * Priv(Alice)

在昨天的帖子《python-bitshares 边学边记 (九) / Memo类》中,我学习了Memo类。


(图源 :pixabay)

Memo 类

Memo类提供了bitshares区块链Memo信息加密和解密的方法。其中,

  • encrypt方法用于加密Memo
  • decrypt方法用于解密Memo
  • 加密Memo需要发送者账户(from_account)的Memo/Active私钥
  • 解密Memo需要接收者账户(to_account)的Memo/Active私钥

发送者查看已发送的Memo的问题

一般情况,我们作为发送者,加密Memo,发送给接收者;或者我们作为接收者,解密Memo,查看明文信息,这些都没问题。

在上文中的例子中,我们从账户test2018发送Memo至oflyhigh-bts

然后从区块链浏览器中获取加密的Memo数据

然后使用如下代码解密Memo

from bitshares.memo import Memo
m = Memo("1.2.534782", "1.2.170436")
enc = {
        "from": "BTS6Eq6kGgYRuujDpFtYduCAjdgMfvkHZ3f8SbHVmsjSC9HgCnxFt",
        "message": "33b980c72e22f942454a8ae6b6740a54",
        "nonce": "387853483215441",
        "to": "BTS8HbXtZPbLACch1pvfrZEPH2xbt74VMPMD4ZSZwYeT96jwkpHFo"}

plaintext_msg = m.decrypt(enc)
print(plaintext_msg)


在这个例子中,我们假定自己是接收者(oflyhigh-bts),并且我们拥有oflyhigh-bts的私钥,所以上述例子没什么问题。

但是考虑这样一种情况,如果作为发送者,我们想查看自己已发送的Memo,并且我们没有接收者的Memo/Active私钥,这时会报如下错误:

raise MissingKeyError("Memo key for %s missing!" % self.to_account["name"])
bitshares.exceptions.MissingKeyError: Memo key for oflyhigh-bts missing!

也就是说使用python-bitshares库的Memo类,发送者无法解密已发送Memo.

如何解决

发送者无法查看自己已经发送的Memo,这听起来有点奇怪,我给别人写了一些信息,过几天想起来想看看我写的是啥,发现我看不了。如果实在想看,只能去问接收者了:“喂喂,我前两天给你发的消息说啥来着?” 这会不会有些尴尬?

还好,网页钱包中,我们可以通过解锁钱包来查看我们发送的Memo

避免了我们上述尴尬情景。

但是,作为程序员,遇到这种问题岂能善罢甘休。

我们来了解一下Memo实现的核心机制,除了加密解密等乱七八糟的东西以外,核心的内容就是: shared secret,具有如下特性:

Pub(Alice) * Priv(Bob) = Pub(Bob) * Priv(Alice)

也就是说,无论是用Pub(Alice)以及 Priv(Bob)或者是Pub(Bob)以及 Priv(Alice)都是可以生成的。换句话讲,无论是加密memo还是解密memo,并不存在谁是发送者谁是接收者的问题!

知道了这个原理,那么问题就好办了。

原本的解密代码如下:

基于上述代码,我们可以轻易实现一个简单解密代码,用于解密已发送Memo

假设我给abit发了一条消息,那么调用上述我实现的代码来解密Memo的示例如下:

请注意,我并没有abit的私钥,但是成功地解密了消息。

总结

  • python-bitshares的Memo类 不支持解密已发送Memo
  • Memo的实现机制核心为:shared secret
  • shared secret符合Pub(Alice) * Priv(Bob) = Pub(Bob) * Priv(Alice)
  • 根据上述原理和原本解密代码,实现了解密已发送信息的代码

参考链接

H2
H3
H4
3 columns
2 columns
1 column
8 Comments