CryptoNight 文档

概要

CryptoNote Standards 介绍了一种点对点的匿名支付系统本文档是 CryptoNote Standards 的一部分定义了 CryptoNote 的缺省工作量证明散列函数CryptoNight。

版权及授权说明

版权所有c2013 CryptoNote。 本文档可在知识共享署名3.0许可证国际许可权限范围内查询。

许可副本 http://creativecommons.org/licenses/by/3.0/

目录

  1. 算法介绍
  2. 名词解释
  3. 初始化流程
  4. 内存处理流程
  5. 结果计算流程
  6. 参考内容

1.算法介绍

CryptoNight是一个使用物理内存的高强度hash算法函数。 它的设计适用于GPUFPGA和ASIC架构上的有效性算力。流程的第一步是初始化大型暂存器与伪随机数据下一步是算法对暂存器中包含伪随机地址的大量的读/写计算操作最后一步是将整个暂存器的hash值进行hash效验验证本次计算产生的价值。

2. 算法定义

hash函数映射数据的有效计算函数对于固定大小的数据、构造特定算法行为产生类似随机数结果

暂存器在算法过程中申请用于存储计算时中间值的部分内存

3. 初始化流程

首先使用参数 b = 1600 和 c = 512 .对输入内容进行Keccak计算 [ KECCAK ]。计算结果的0..31字节用作AES-256密钥[AES]并扩展为10个循环密钥申请一个分配了2097152字节2 MB空间的暂存器从计算结果的64..191字节处提取出来数据并分割成8个块每个块16字节。使用以下步骤对每个块进行加密

for i = 0..9 do:
block = aes_round(block, round_keys[i])

aes_round() 函数执行一轮AES加密对本块执行 SubBytes ShiftRows 和 MixColumns 步骤其结果与round_key进行异或运算。但这不同于AES加密算法第一轮计算和最后一轮计算没什么不同。

一轮下来得到的计算结果写入暂存器的前128个字节然后这些结果再次代入加密循环再把这次循环结果写入暂存器的第二个128字节里。这里每次往暂存器里写入下一个128字节都代表对先前写入的128字节内容在新一轮加密的结果。流程一直循环直到暂存器写满。至此一次算法的初始化就完成了。

该图表示暂存器初始化

                               +-----+|Input|+-----+|V+--------+| Keccak |+--------+|V+-------------------------------------------------------------+|                         Final state                         |+-------------+--------------+---------------+----------------+| Bytes 0..31 | Bytes 32..63 | Bytes 64..191 | Bytes 192..199 |+-------------+--------------+---------------+----------------+|                             |V                             |+-------------+                      V| Round key 0 |------------+---+->+-----++-------------+            |   |  |     ||      .      |            |   |  |     ||      .      |            |   |  | AES ||      .      |            |   |  |     |+-------------+            |   |  |     || Round key 9 |----------+-|-+-|->+-----+                 +---++-------------+          | | | |     |                    |   || | | |     +------------------->|   || | | |     |                    |   || | | |     V                    |   || | | +->+-----+                 |   || | |    |     |                 | S || | |    |     |                 |   || | |    | AES |                 | c || | |    |     |                 |   || | |    |     |                 | r || | +--->+-----+                 |   || |         |                    | a || |         +------------------->|   || |         .                    | t || |         .                    |   || |         .                    | c || |         +------------------->|   || |         |                    | h || |         V                    |   || +----->+-----+                 | p ||        |     |                 |   ||        |     |                 | a ||        | AES |                 |   ||        |     |                 | d ||        |     |                 |   |+------->+-----+                 |   ||                    |   |+------------------->|   ||   |+---+

4. 内存处理流程

在主循环之前对输入内容进行Keccak计算后取0..31字节和32..63字节进行异或所得到的32字节结果用于初始化变量a和b分别各占16字节这两个变量将用于主循环主循环进行524,288次迭代当一个16字节值需要转换成暂存器中的一个地址将以低字节顺序压入内存21位低字节用作索引但是索引中的4个低字节将被清除以确保地址索引统一16字节对齐。 数据从16字节块中读取并写入暂存器。

迭代流程伪代码

scratchpad_address = to_scratchpad_address(a)
scratchpad[scratchpad_address] = aes_round(scratchpad [scratchpad_address], a)
b, scratchpad[scratchpad_address] = scratchpad[scratchpad_address],b xor scratchpad[scratchpad_address]
scratchpad_address = to_scratchpad_address(b)
a = 8byte_add(a, 8byte_mul(b, scratchpad[scratchpad_address]))
a, scratchpad[scratchpad_address] = a xor scratchpad[scratchpad_address], a

8byte_add() 函数将每个参数表示为一对64位低位值并将它们组合在一起以分量形式进行快速模除 2 ^ 64。 其结果返回16字节。

8byte_mul() 函数仅使用每个参数的前8个字节并分别解析为无符号64位低位字节整数并相乘。 其结果返回16字节最后结果分半两边的8字节相互交换。

内存处理流程图

   +-------------------------------------------------------------+|                         Final state                         |+-------------+--------------+---------------+----------------+| Bytes 0..31 | Bytes 32..63 | Bytes 64..191 | Bytes 192..199 |+-------------+--------------+---------------+----------------+|             ||   +-----+   |+-->| XOR |<--++-----+|   |+----+   +----+|             |V             V+---+         +---+| a |         | b |+---+         +---+|             |--------------------- REPEAT 524288 TIMES ---------------------|             |                            address +---++-------------|----------------------------------->|   ||   +-----+   |                               read |   |+-->| AES |<--|------------------------------------|   ||   +-----+   V                                    |   ||      |   +-----+                                 | S ||      +-->| XOR |                                 |   ||      |   +-----+                           write | c ||      |      |    +------------------------------>|   ||      |      +----+                       address | r ||      +------------------------------------------>|   ||      |  +-----------+                       read | a ||      +->| 8byte_mul |<--+------------------------|   ||      |  +-----------+   |                        | t ||      |        |         |                        |   ||      |        V         |                        | c ||      |  +-----------+   |                        |   |+------|->| 8byte_add |   |                        | h ||  +-----------+   |                        |   ||        |         |                  write | p ||        +---------|----------------------->|   ||        |         |                        | a ||        V         |                        |   ||     +-----+      |                        | d ||     | XOR |<-----+                        |   ||     +-----+                               |   |+------+ |                                  |   |+-------------|-+                                  |   ||             |                                    +---+-------------------------- END REPEAT -------------------------|             |

5. 结果计算流程

在内存操作完成之后使用与第一步骤初始化步骤分相同的方式进行Keccak计算最终结果的32..63字节被扩展成10个AES循环密钥。

从Keccak结果里提取64..191字节并与暂存器里前128个字节进行异或运算。然后结果以与第一步初始化步骤使用相同的方式进行加密但是使用新的密钥。结果继续与暂存器中的第二个128个字节进行异或运算依次循环加密迭代。

在暂存器的最后128个字节进行异或运算后就是流程的最后一次加密完成后将原本Keccak结果的64..191字节内容替换为本次加密内容。然后以b = 1600对整个块内容进行Keccak-fKeccak排列。

然后结果中第一个字节的2个低位比特用于进行散列函数运算0 = BLAKE-256 [BLAKE]1 = Groestl-256 [GROESTL]2 = JH-256 [JH] 3 = Skein-256 [SKEIN]。最后将所选的散列函数应用于Keccak最终结果生成的散列就是CryptoNight算法的计算输出。

结果计算流程图

   +-------------------------------------------------------------+|                         Final state                         |+-------------+--------------+---------------+----------------+| Bytes 0..31 | Bytes 32..63 | Bytes 64..191 | Bytes 192..199 |+-------------+--------------+---------------+----------------+|                |             |                ||       +--------+             |                ||       V        |             |                ||+-------------+ |             |                ||| Round key 0 |-|---+---+     |                ||+-------------+ |   |   |     |                |||      .      | |   |   |     |                |||      .      | |   |   |     |                |||      .      | |   |   |     |                ||+-------------+ |   |   |     |                |+---+ || Round key 9 |-|-+-|-+ |     V                ||   | |+-------------+ | | | | |  +-----+             ||   |-|----------------|-|-|-|-|->| XOR |             ||   | |                | | | | |  +-----+             || S | |                | | | | |     |                ||   | |                | | | | |     V                || c | |                | | | | +->+-----+             ||   | |                | | | |    |     |             || r | |                | | | |    |     |             ||   | |                | | | |    | AES |             || a | |                | | | |    |     |             ||   | |                | | | |    |     |             || t | |                | | | +--->+-----+             ||   | |                | | |         |                || c | |                | | |         V                ||   | |                | | |      +-----+             || h |-|----------------|-|-|----->| XOR |             ||   | |                | | |      +-----+             || p | |                | | |         |                ||   | |                | | |         .                || a | |                | | |         .                ||   | |                | | |         .                || d | |                | | |         |                ||   | |                | | |         V                ||   | |                | | |      +-----+             ||   |-|----------------|-|-|----->| XOR |             ||   | |                | | |      +-----+             |+---+ |                | | |         |                ||                | | |         V                ||                | | +----->+-----+             ||                | |        |     |             ||                | |        |     |             ||                | |        | AES |             ||                | |        |     |             ||                | |        |     |             ||                | +------->+-----+             ||                |             |                |V                V             V                V+-------------+--------------+---------------+----------------+| Bytes 0..31 | Bytes 32..63 | Bytes 64..191 | Bytes 192..199 |+-------------+--------------+---------------+----------------+|                       Modified state                        |+-------------------------------------------------------------+|V+----------+| Keccak-f |+----------+|    |+-----------+    ||                |V                V+-------------+  +-------------+| Select hash |->| Chosen hash |+-------------+  +-------------+|V+--------------+| Final result |+--------------+

计算结果举例

    Empty string:eb14e8a833fac6fe9a43b57b336789c46ffe93f2868452240720607b14387e11."This is a test":a084f01d1437a09c6985401b60d43554ae105802c5f5d8a9b3253649c0be6605.

白皮书里头涉及的算法在example里两个Miner项目中都有c实现。

PoolSocket:

client >>{"method": "login","params": {"login": "********** [ Wallet Addr ] **********","pass": "","agent": "xmr-stak-cpu/1.3.0-1.5.0"},"id": 1
}server <<{"id": 1,"jsonrpc": "2.0","error": null,"result": {"id": "811233385116793","job": {"blob": "0606e498c5ce057326423f235dcd67dec07d9cb79e3506da8b35198e7debb40be3cbc2326c1999000000008bad7c9d5b78e9c9693903e817d20c09befe2c72ee6d20f297c0026d9a6e492406","job_id": "664084446453489","target": "711b0d00"},"status": "OK"}
}client >>{"method": "submit","params": {"id": "811233385116793","job_id": "664084446453489","nonce": "11018000","result": "0e9b264a2a225cbbdc520b1fbef207a12e092c23325b7667c27bd0d95a590c00"},"id": 1
}server <<{"id": 1,"jsonrpc": "2.0","error": null,"result": {"status": "OK"}
}server <<{"jsonrpc": "2.0","method": "job","params": {"blob": "0606e498c5ce057326423f235dcd67dec07d9cb79e3506da8b35198e7debb40be3cbc2326c199900000000253addee86a405a4553dee713dabb28bd5cbb5a6556ddb332ad46ffdcf0c073a06","job_id": "183626817283220","target": "58dd0700"}
}.
.
.

WebSocket:

web >>{"type": "auth","params": {"site_key": "******* [ siteKey ] *******","type": "anonymous","user": null,"goal": 0}}srv <<{"type": "authed","params": {"token": "","hashes": 0}}{"type": "job","params": {"job_id": "931350207026116","blob": "0606ffbddece05a1e21456e45a3ca88d8e0ff2f299568aecc5db053f08e04774cdfba60d0ae4db000000003d710b3b5444505391ba01b634f94d72915bda5a7999499f40f62e3046b254b403","target": "ffffff00"}
}web >>{"type": "submit","params": {"job_id": "931350207026116","nonce": "197aae72","result": "6d9a8c2da95bcd498a4056631f1a03b51f2d6806b1c6d44e4f45fd9878b6eb00"}}srv <<{"type": "hash_accepted","params": {"hashes": 256}}web >>{"type": "submit","params": {"job_id": "931350207026116","nonce": "edd815a0","result": "ca182b3086f441510397d67b2323014d201aa14b89b6c1fcf59759794540a900"}}srv <<{"type": "hash_accepted","params": {"hashes": 512}}web >>{"type": "submit","params": {"job_id": "931350207026116","nonce": "6e791848","result": "9fec44bc7d338b5e114e138ee902066ba8d6a2a0e4c0b6090fa94571eca54900"}}srv <<{"type": "hash_accepted","params": {"hashes": 768}}
.
.
.

CryptoNight相关推荐

  1. Yarn 问题发现与解决

    2019独角兽企业重金招聘Python工程师标准>>> 问题发现 实际上是在写一个小东西的时候, 有一部分想看看 Kafka 的一些情况参考一下, 跑到开发集群上去看了看, 结果发现 ...

  2. 利用redis漏洞远程添加计划任务挖取比特币

    周日看到值班人员在群里发几台服务器CPU负载高告警.没在意.周一下午查看nagios 发现服务器的负载依旧很高.赶紧查看进程 看到第二张图的时候.想必大家明白了.又是挖矿软件.记得之前曝光过是一款叫m ...

  3. 阿里云服务器被挖矿程序minerd入侵的终极解决办法[转载]

    突然发现阿里云服务器CPU很高,几乎达到100%,执行 top c 一看,吓一跳,结果如下: 3798 root 20 0 386m 7852 1272 S 300.0 0.1 4355:11 /tm ...

  4. aes密钥扩展java实现,需要使用bouncycastle将AES 256密钥“扩展”为...

    AES-128使用10轮,AES-192使用12轮,AES-256使用14轮. 使用BouncyCastle,可以在名为org.bouncycastle.crypto.engines.AESEngin ...

  5. 任正非:华为鸿蒙将比安卓快 60%;小米已官方回应侵权偷图事件;博通正考虑收购软件公司,其中Tibco和赛门铁克为重点目标……...

    关注并标星星CSDN云计算 极客头条:速递.最新.绝对有料.这里有企业新动.这里有业界要闻,打起十二分精神,紧跟fashion你可以的! 每周三次,打卡即read 更快.更全了解泛云圈精彩news g ...

  6. 因为apple无法检查其是否包含恶意软件_新Linux恶意脚本——清理其他恶意软件后再感染...

    根据Check Point的一份研究报告,在2018年,加密货币挖矿恶意软件对组织的影响是勒索软件的十倍,而且越来越多的恶意软件家族开始在他们的武器库中加入针对加密货币的新功能.新版本变得越来越复杂, ...

  7. supsplk 服务器被植入木马 挖矿 cpu使用 700%

    最近emr集群跑任务的时候总出现 task failed ,优化sql,调提交任务参数都没解决,最后再我排查时候,发现一个从节点的cpu使用800% 经过一些列排查,发现是被注入木马了, #被人种下的 ...

  8. 比特大陆的“新筹码”:IPO失效后,押注算力芯片

    文 | 棘轮 3月26日,比特大陆在港交所的招股书显示失效.这意味着,比特大陆的赴港IPO之旅宣告终结. 随后,比特大陆发布了一封内部信,确认此轮IPO失效,并在内部信中回应了此前外界疯传的一系列传言 ...

  9. 加密货币工具和算法大合集

    2019独角兽企业重金招聘Python工程师标准>>> 维基百科- 加密货币加密货币是一种利用密码学原理来保证账户之间交易的安全性并且控制货币发行量的数字资产. 现在市面上已经存在各 ...

最新文章

  1. 浮层java_css保持浮层水平垂直居中的四种方法
  2. 自动化电子测试软件,自主开发的MIL测试自动化测试工具
  3. “数据分析”如何作用于“用户研究”?--转载微博
  4. pycharm中如何正确配置pyqt5
  5. python paramiko使用
  6. HDOJ 1285 确定比赛名次(拓扑排序)
  7. 铁道部2012年版全国72个铁路枢纽城市
  8. hpux系统启动中被某个服务hang住的解决办法
  9. 《数据库技术原理与应用教程第2版》——3.6计算机世界与物理模型
  10. Spring-Logback-动态修改日志级别
  11. Error: failed to unmarshal json. invalid character '\'' looking for beginning of value解决方案
  12. 关于编辑区无法调用chekbox的问题
  13. 二十一世纪大学英语读写基础教程学习笔记(原文)——4 - The Happiest Man in the World(世界上最幸福的人)
  14. 武汉大学计算机学院2018夏令营,武汉大学
  15. 怎么查充电器支不支持pd快充协议_新买的iPhone11不能快充?很可能是因为你没用对充电器...
  16. 计算机excel取整函数,Excel取整公式集锦
  17. 如何永久关闭QQ广告弹窗
  18. BGP高防服务器与普通高防服务器有什么区别?
  19. 全国各地迎来降雪,我们准备了五件发热好物,让你暖暖度过这个寒冬 | 钛空实测
  20. 红楼梦人物分词及可视化

热门文章

  1. Kali Linux修改更新源
  2. qq私聊顺序回复_QQ为什么难以替代
  3. Java基础笔试练习(八)
  4. Web3还没实现,Web5乍然惊现!
  5. HttpRunner
  6. Android 面试黑洞——当我按下 Home 键再切回来,2021必看-Android高级面试题总结
  7. win7共享计算机打不开,windows7共享文件夹打不开怎么办
  8. 在中国怎么使用tiktok
  9. 文化苦旅 余秋雨著
  10. 深入学习Spring框架之一Spring的简要概括