您正在查看: 2021年1月

gobfuscate的混淆原理

近期,在看360net lab发布的一篇文章Blackrota, a heavily obfuscated backdoor written in Go时,看到了go语言的混淆手段,在文章中,攻击者使用开源的混淆工具gobfuscate对语言的源代码进行混淆,在对混淆之后的代码进行编译,以提高分析的难度。

根据gobfuscate的描述,gobufuscate会在源码级别混淆如下的数据:

  1. 包名
  2. 全局变量名
  3. 函数名
  4. 类型名
  5. 方法名

我们使用如下的代码来测试以下gobfuscate的混淆:

package main

import(
    "fmt"
    "io/ioutil"
    "net/http"
)
var url = "https://www.baidu.com/";
func httpget() string {
    client := &http.Client{}
    req, _ := http.NewRequest("GET",url,nil)
    req.Header.Set("Connection","Keep-Live")
    res,err := client.Do(req)
    if err != nil{
        fmt.Println("do error\n")
        return "NULL"
    }
    defer res.Body.Close()
    body,err := ioutil.ReadAll(res.Body)
    return string(body)
}
func main(){

    var body = httpget()
    fmt.Println(string(body))
}

首先gobfuscate生成的二进制文件符号是被抹除掉的:

使用go_parser对生成的二进制文件的符号进行解析,可以发现其源代码路径也被混淆了,但是源代码的文件名并没有被混淆。


函数名使用随机字符串混淆了。

对于每一个字符串,都会产生一个对用的解密函数,使用xor会字符串进行混淆。

转载自:https://mp.weixin.qq.com/s/X0iLtov4bH-HY4nhwo-zQQ

MPC安全多方计算

隐私问题是目前区块链技术所要解决的其中一重要问题,隐私保护不仅在区块链领域成为了重点研究内容之一,而且近几年不断出现的数据隐私泄露问题,也让公众对隐私保护有日益深入的认知。

PlatON基于安全多方计算密码学算法实现一种隐私合约的解决方案,主要思想是将隐私计算算法通过合约进行发布,并由隐私保护需求的数据提供方和计算节点配合执行MPC协议,以实现数据的协同计算。

安全多方计算介绍

安全多方计算,英文全称为Secure Multi-Party Computation,简称MPC。它指的是用户在无需进行数据归集的情况下,完成数据协同计算,同时保护数据所有方的原始数据隐私。具体来说,有n个计算参与方,分别持有私有数据 共同计算既定函数

计算完成,得到正确计算结果y,且参与各方除了自己的输入数据和输出结果外,无法获知任何额外有效信息。
MPC协议满足的基本性质是:

  • 输入隐私性: 协议执行过程中的中间数据不会泄露双方原始数据的相关信息;
  • 健壮性: 协议执行过程中,参与方不会输出不正确的结果。

构建通用MPC协议的典型范式之一是基于姚期智提出的针对两方计算的加密电路方法,并由Beaver、Micali 和Rogaway 进一步扩展到多方计算。目前MPC相关的协议或算法有Garbled Circuit、Oblivious Transfer、Secret Sharing、BGW、GMW、BMR等,同时工程实现上也有如SPDZ、LEGO、Sharemind、Fairplay等不同的安全多方计算框架出来。典型的安全两方计算所使用的协议为加密电路(Garbled Circuit, GC)和不经意传输(Oblivious Transfer, OT)。

Garbled Circuit

关于Garbled Circuit原理,可进一步参考此页面所做的解释。

目前已经有很多对加密电路进行优化的方案。包括Free-XOR 技术,这意味着XOR 门几乎无需加密,row reduction 和half gate技术,将每个AND门所需要的密文从4个降为2个。最近使用认证加密电路的研究结果实现了针对两方和多方恶意敌手模型下非常有效的协议。

若有兴趣对Garbled Circuit的理论知识作更深入的了解,可参考此论文。

Oblivious Transfer

Oblivious Transfer,中文称为不经意传输,通常简写为OT,它指的是发送者从一个值集合中向接收者发送单个值的问题,这里发送者无法知道发送的是哪一个值,而且接收者也不能获知除了接收值之外的其它任何值。形式化描述为:发送者有由N个值组成的集合,接收者有索引协议执行完成,接收者只知道不知道,这里并且发送者不知道i,这称为1-out-of-N Oblivious Transfer。

对于N=2,即为1-out-of-2 Oblivious Transfer,接收者在计算加密电路之前,首先根据自己的输入数据获得与之对应的标签,由于标签是发送者定义的,因此接收者与发送者之间执行此OT协议。接收者按照其输入的每个比特,以σ=0/1为输入,发送者以标签m0、m1为输入。协议执行完成,接收者获得标签mσ。图7为1-out-of-2 OT的示意图。协议执行的过程中,满足以下性质:

  • 发送者不可获知接收者选择的是哪个标签;
  • 接收者无法知道另一个标签

两方安全计算的工作原理

两方计算的实现过程为:

两个计算参与方Alice和Bob,想共同计算
这里s为Alice所拥有的数据,t为Bob所拥有的数据,f为计算逻辑。首先,Alice将f转换为相应的布尔电路C,其中C的每个门都有一个真值表表示门的输入输出。然后,Alice对真值表进行加密处理,得到加密电路同时,Alice也对其输入进行加密,然后将加密后的输入与加密电路一同发送给Bob。那么此时Bob就拥有了和Alice的加密输入(对应于Alice输入的标签),但却未被告知Alice的加密过程,因此Bob就无法获知该如何使用自己的输入。这时,Bob通过与Alice之间执行1-out-of-2 Oblivious Transfer协议来获得加密输入(对应于自己输入的标签)。之后,Bob使用两方的加密输入对加密电路逐个门进行解密,获得电路计算结果。

总体分为如下五个步骤,其详细过程解释如下:

1. 布尔电路生成

假设是需要安全计算的函数,将此函数转换为布尔电路满足对任意理论上任意函数均可表示成布尔电路。布尔电路的格式如图1所示:

图2: 函数转换为布尔电路

2. 加密电路生成

Alice将函数转换为布尔电路后,将电路的每个门表示成如图2所示的真值表,接着通过加密这些真值表将转化为加密电路

图3: 将电路中的每个门表示成真值表

PlatON中的安全多方计算

安全多方计算为PlatON实现隐私数据的协同计算提供了根本性的技术手段,在PlatON中结合MPC实现隐私合约,为具有多方参与数据作为输入的应用提供隐私保护,实现真正的隐私计算。

PlatON的两方安全计算架构如下:

PlatON的隐私合约同样支持高级语言编程,但不是编译成庞大的布尔电路文件,而是编译成更高效的LLVM IR字节码,并部署到PlatON网络上,在MPC计算节点内置的MPC虚拟机中以JIT方式执行。隐私合约的输入数据保存在数据节点本地,由数据节点在链下以安全多方计算方式进行隐私计算,并提交计算结果到链上。

PlatON会持续优化当前已实现版本的MPC性能,并实现更先进的MPC协议,在以下几个方面进行改进:

  • 结合同态加密(HE)来降低MPC的通信复杂度
  • 从两方安全计算实现到三方以上的多方计算,以满足更加复杂多样化的应用场景

转载自 https://devdocs.platon.network/docs/zh-CN/Secure_Multi_Party_Computation/

开源代码:https://github.com/PlatONnetwork

HD钱包地址生成JavaScript库

支持的加密货币

BTC,ETH,BCH,SLP,BSV,DASH,LTC,DOGE,EOS,XRP,NAV ,STRAT

开源库地址:https://github.com/lpopo0856/cryptohdwallet

合约推送Action参数为time_point的序列化处理

将时间转换为微妙(uint64)推送,链上会自动转为time_point类型