如果你在HIVE/STEEM上进行过转账操作,那么你一定知道我们转账操作的时候是可以加备注信息(memo)的,这个备注信息也往往用来让交易所判断充值操作的所属用户,那么你知道Memo是可以加密的吗?
(图源 :pixabay)
加密memo
如果在钱包里操作,在memo前边加一个#
那么就会被识别为一条要消息的消息,并对其进行相应的加密处理。
(注一:并非所有的钱包都支持加密/解密操作)
(注二:有的交易所不支持加密memo,请慎用)
加密操作看起来很简单不是?另外别人发给我们的加密消息,貌似我们也不需要额外做什么其它工作,就可以直接看到了,这又是怎么回事呢?
实际上,memo加密解密还是个很复杂的事情呢!比如我发的一条加密消息,实际上是长成这样的:
memo部分的内容如下:
#C3JiuC9zrPkJRTK3bfz1HHJHvUuLPw4yiWS3bGYMABMvV84UYvmF7jqR58Hg5nor2F1uoSJjWMDsbuAjZJBxLyafj9byDqdvrH1izHePU9T8XZe53vCyvZc3NKPPrsRxw
想必你我都看不出来什么,其实简单来讲这段内容就是包含加密memo在内的数据的base58编码再加上前缀#
。
理论基础
既然加密,那就涉及到一个密码,而这个密码是如何获取的呢?这就涉及memo加密的理论基础了。
在好久之前,我学习bitshares的Python库的时候,写过一篇文章,里边写了我的学习的一些体会,似乎可以拿来直接用:
我们来了解一下Memo实现的核心机制,除了加密解密等乱七八糟的东西以外,核心的内容就是: shared secret,具有如下特性:
Pub(Alice) * Priv(Bob) = Pub(Bob) * Priv(Alice)
也就是说,无论是用Pub(Alice)以及 Priv(Bob)或者是Pub(Bob)以及 Priv(Alice)都是可以生成的。换句话讲,无论是加密memo还是解密memo,并不存在谁是发送者谁是接收者的问题!
这意味着什么呢?这意味着发送者可以用发送者的私钥以及接收者的公钥计算出来一个密码,而接收者可以用接收者的私钥和发送者的公钥计算出相同的密码。
这是不是非常之神奇啊?简直太过于巧妙了。
验证脚本
尽管理论上:
`Pub(Alice) Priv(Bob) = Pub(Bob) Priv(Alice)`
但是不经过验证,我心里还是没有底的,所以写一段简单的脚本测试一下:
代码中我生成了Alice和Bob对应的memo公私钥,然后测试是否符合上述条件,代码运行结果如下:
亦即:
Pub(Alice) * Priv(Bob) = Pub(Bob) * Priv(Alice)
Pub(Alice) * Priv(Alice) != Pub(Bob) * Priv(Bob)
说明memo加密的理论基础是正确无误的。
补充
从Pub(Alice) * Priv(Bob) = Pub(Bob) * Priv(Alice)
我们得知,其实任何配对的公私钥都可以,不一定非得用memo KEY,但是因为memo key不存在多签/多重授权,使用起来最为方便了,原则上则是可以使用owner/active/posting各级私钥的。
当然,使用其它私钥加密memo,也许会增加解密方的操作的复杂性(我觉得并不会)。
(图源 :pixabay)
还有一点就是因为解密memo要用到自己的memo私钥,而一旦修改密码,memo私钥也会随之修改,如果你不记得以前的密码或私钥,那么之前你收到的加密memo,可能就再也无法自己查看了。
相关链接
This page is synchronized from the post: ‘每天进步一点点:探索memo加密的理论基础’