操作方法
在内存操作完成之后使用与第一步骤初始化步骤分相同的方式进行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. 可见此Coinhive脚本中XMR挖矿算法(cryptonight)就是靠一下任意一个形式实现的对C书写的算法的封装了。 wasmBinaryFile => (cryptonight.wasm) asmjsCodeFile => (cryptonight-asmjs.min.js) asm.js 和 WebAssembly 如何将C代码转为可执行的javascript文件抱歉这一下子根本就讲不清楚所以大家只需要知道这两项技术旨在提升浏览器内执行效率的类似“汇编”方式的实现快速运算的解决方案就可以了。
脚本里使用它其一目的是解决javascript内浮点运算等在弱类语言难以高效率执行的问题。其二两个框架将已有的成型miner所用算法实例c语言脚本直接转换成js模拟的脚本大大缩短了开发周期。可谓两全其美。 可供转换使用的工具有 Emscripten 、 binaryen 、 WABT 等。
简评一下两者区别: asm.js 框架 可以由手写方式字符串书写拥有极大的可读性用于计算类的实现性能也达到同样C脚本2/3效率。 WebAssembly 框架 而是以由c语言脚本书写再通过编译成中间件file.wasm的Buffer形式实现因此执行更加高效。