Telegram Channel
记录和分享有趣的信息。

Record and share interesting information.

contact: [email protected]
https://youtu.be/t8qGtEVh7oQ?si=i7BDTBO2ZoLqZYhi

最近爱上刷 Bloomberg 的纪录片了,制作都很不错。

《The Forever Chemical Scandal》介绍了人造有机化合物家族 PFAS,它的主要危害表现为:

1. 能够在人体和自然界永久存在,且已经在人体和自然界中广泛存在;
2. 多年来被大量制造和广泛使用,遍布于日常生活之中;
3. 对人体的危害仍然缺乏全面的研究,目前发现对免疫系统有抑制作用;
4. 可以通过母婴传给下一代,换言之,PFAS 已经将人类永久污染了。

PFAS 化合物家族的成员数量繁多,目前难以对其进行一一检测和研究。而且因为多年的广泛使用,即使在没有任何工业的法罗群岛上,也在人体中检测到了高浓度的 PFAS 污染。

PFAS 诞生于曼哈顿计划,后来因为其优秀的防水特性,被 3M 公司用于广泛的消费品之中。3M 公司很早前就在内部调查过 PFAS 的潜在危害,然而和其他所有的巨头公司一样,决定对自己重要产品的危害性严守秘密。

前些年的水污染大案《Dark Waters》的罪魁祸首 PFOA 也是 PFAS 家族的一员,不过这次隐藏秘密的换成了杜邦公司(DuPont)。

next: https://t.me/laiskynotes/181
https://youtu.be/Azm4yKKIlqE?si=fMmY_X1-4yR-yYwT

一部短小但是很深刻的纪录片,介绍欧美对俄罗斯原油价格实施价格制裁(Price Cap)后,实际上没有起到应有的作用,反而导致通胀和养肥了一大帮掮客。

简单介绍下背景,世界上有两个主要的原油交易市场:布伦特(Brent)和乌拉尔(Urals),俄罗斯的原油主要通过乌拉尔市场进行交易。俄罗斯入侵乌克兰后,欧美对乌拉尔原油实施了一系列的限制,包括禁售、限价等等。战前两个市场的原油价格非常接近,但是随着制裁,布伦特的价格上涨,乌拉尔的下跌,两个市场间出现了相当大的价差。

中国人最熟悉的,行政干预让市场扭曲,那就会存在权力寻租的空间。因为布伦特和乌拉尔的大幅价差,进口乌拉尔原油再倒卖去布伦特就成了一个暴利的生意,而其中的关键就是如何“洗油”,将乌拉尔原油的俄罗斯身份清洗干净,片中介绍了两种方式:

1. 将乌拉尔原油输送中国、印度进行加工提炼后,再以成品油的身份出口,这就不是俄罗斯的产品了。
2. 载满乌拉尔原油的油轮来到公海,秘密将原油输送给另一艘身份干净的油轮。

于是就有了图中的那一幕,俄罗斯购买了大量破烂不堪的油轮组成影子舰队(shadow fleet),负责将乌拉尔原油运送至希腊附近的海域,然后偷偷将原油转运至另一艘身份清白的油轮上,神不知鬼不觉地完成了“洗油”。再将这些原油运送至中国和印度精炼,最后将成品油以高价出口至欧美。有需求就会有供应,市场永不停转,一切都是利益分配的游戏。

这一现象反映出几个问题:
1. 欧美对全球市场的控制力远不如当初了,G7 的全球 GDP 占比只有 30% 出头,和 BRICS 几乎平起平坐
2. 行政对市场的扭曲几乎总是失效的,最终无非是利益的转移。这次原油制裁就是把消费者的利益转移给了掮客,而掮客们的背后,是谁?

Ps. 片里的希腊风光真漂亮
Laisky's Notes
https://laisky.notion.site/Anonymous-Credential-Part-2-Selective-Disclosure-and-CL-Signature-4e88462949764a579222d810c614842a 想象这么一个场景,政府给你签发了身份证,政府为这个证件背书上面的信息都是真实有效的。 然后你为了上某 X 网站,需要证明你已经年满 18 岁。于是你把身份证信息加密后上传给网站,然后选择只披露其中的姓名和年龄属性。网站通过签名验证这个身份信息确实是由政府…
简单粗暴地理解椭圆曲线算法(Elliptic Curve Cryptography)。

首先,绘制一个扭曲的曲线。然后在这个曲线上定义一种名为加法的运算:

1. P 点和 Q 点相加: 绘制直线 PQ,得到和曲线的第三交点为 R,R 的 x 轴镜像点为结果。
2. P 点自己和自己相加: 绘制 P 点的切线,得到和曲线的交点 R,其镜像点为结果。
3. 定义零值为 y 轴的无穷远处,和零相加等于画一条垂直线。

如上我们定义了运算规则,接下来就是从曲线的点中选取一些点构成一个循环群。群就是一组满足相同规律的数的集合。循环群(cycle group)中存在一些本原元(primitive element),这些原元通过不断累加,可以遍历整个群。

形象地说,你找到一个本原元点(primitive element),然后不断地累加这个点,利用前文我们所介绍的加法运算,你其实就是在曲线上不断地跳跃,并最终会跳回起点。

ECC 加密算法中,就是构建这么一个曲线,它的循环群内的成员数量达到 2^100 次方,我们认为这个量级的数是无法靠暴力遍历破解的。这个曲线的每一个值是根据一个大素数的模的方程构建的,成员数量约等于这个素数的位数,一个 160-bits 的素数可以构建一个包含 2^160 个点的群。

然后给出这么一个公式 dP = T。P 是一个 primitive element,它累加 d 次后会得到 T 点。P、T 是公钥,d 是私钥。这也是为什么 ECC 的私钥可以很短。

也就是说,我公开展示最终的 T 点,但是不告诉你我跳跃了多少次。你是难以通过暴力遍历去求解 d 的。这个 dP = T 就是构建了一个离散对数问题(DLP),计算 dP 很简单,但是逆运算求算 d 很复杂,需要暴力搜索 2^100 的空间。

既然利用 ECC 构建了 DLP,那么就可以利用 ECC 替换传统 DLP 问题,比如 Diffie-Hellman 密钥交换算法,现在可以重构为基于 ECC 的 ECDH 算法。

Alice 和 Bob 都确认一个曲线和一个 primitive element P。然后双方各自生成一个 d,然后交换计算结果 dP。拿到对方的 dP 后再乘上自己的 d,就会得到一个相同的 T。窃听者能拿到曲线、P、d_alice*P 和 d_bob*P,但是他无法逆向求解 d_alice 和 d_bob,所以无法破解最终的 T。

PS: 所有的 DHKX 算法,都难以防御中间人攻击(MITM attack),即攻击者可以篡改通信,同时和双方握手。解决办法是引入数字证书,对对方的公钥进行签名。
PS: 安全的椭圆曲线是很难绘制的,一般参考 NIST 的推荐。 #crypto

next: https://t.me/laiskynotes/173
https://youtu.be/x_isZHaZjcU?si=fUVBFw_FvrkqJi63

通过访谈和讲述几位以色列人和巴勒斯坦人的真实故事,非常简明扼要的阐明了自 1948 年以色列建国以来的 60 年动荡历史。

先是在战争中从周围的阿拉伯国家里获取领土,通过大驱逐建立了一个犹太国家。然后是与周边国家的艰难和谈,经过以色列 Meir 夫人、埃及 Anwar El-Sadat 总统、巴勒斯坦武装领袖 Yasser Arafat、以色列总理 Yitzhak Rabin 等人的不懈努力,曾一度取得了和平的希望。

可惜激进派的火苗从不曾熄灭,Sadat、Rabin 被暗杀,加沙地区信奉原教旨主义的哈马斯崛起,Arafat 被边缘化。以色列的鹰派 Netanyahu 上台,奥斯陆协议(Oslo Accord)被抛弃。巴以之间陷入了漫长的袭击与报复的循环,迄今看不到任何和解的希望。

next: https://t.me/laiskynotes/204
https://youtu.be/r0Ji7KqqEqg?si=Dobd3qPl8BW8zZHm Hostomel 之战的详细解释。实际上俄军 VDV 强袭机场得手后,当天下午就被包围了。乌军的炮击破坏了机场设施,使得 18 架次的后续增援部队无法降落。
我觉得降落了估计也不会有特别大的影响,毕竟俄军主力很快就从北方推进到了此处,然而除了搞个 bucha 大屠杀外再也无所作为。
https://laisky.notion.site/Anonymous-Credential-Part-2-Selective-Disclosure-and-CL-Signature-4e88462949764a579222d810c614842a

想象这么一个场景,政府给你签发了身份证,政府为这个证件背书上面的信息都是真实有效的。

然后你为了上某 X 网站,需要证明你已经年满 18 岁。于是你把身份证信息加密后上传给网站,然后选择只披露其中的姓名和年龄属性。网站通过签名验证这个身份信息确实是由政府颁发的,其中的信息真实可靠,而且证件上的年龄显示你已经年满 18 岁,而证件上的其他信息都对网站不可见。

在上述流程中,政府(issuer)为你(holder)签发了信息,你选择将部分信息披露给网站(verifier)。这就是 Anonymous Credential(Anoncred)或称为 Attribute-based Credential(ABC)。

这一算法的特点包括:

1. issuer 可以使用一对公私钥,签发 K 组信息。
2. holder 可以选择性地披露 N 组信息(N<=K)。
3. verifier 可以通过 issuer 的公钥验证 holder 所披露的信息的有效性。

穿插提一下密码学中的 Commitment Schema。Alice 可以对一个未披露的 Message 声明 Commitment,Bob 可以保留这一 Commitment,直到 Alice 披露 Message 后,Bob 可以验证这一 Message 是否与 Commitment 一致。结合前面所提的 ABC,其实就是一个 Commitment Schema,Issuer 为 Holder 的信息背书(statement signature),Verifier 需要 Holder 披露信息后才能验证真实性。

最简单的实现就是基于 RSA 的 CL Signature,更多细节可点击查看: https://telegra.ph/CL-Signature-02-26-2 #crypto

next:
- ECC & ECDSA & ECDH
- AC & ZKP
Laisky's Notes
https://laisky.notion.site/How-Hype-Will-Turn-Your-Security-Key-Into-Junk-ac50dfbc44354bdfab17ef76e72ece13 非常不错的文章,介绍了目前 passkey 领域可能正在走的一条歧路。 补充:关于 yubikey 是什么,以前写过一篇文章 https://blog.laisky.com/p/yubikey/ 众所周知,FIDO、WebAuthn 等正在推动 passwordless,也就是放弃让用户记忆…
此前讨论过 passkey 的一个缺陷(https://t.me/laiskynotes/64 ),就是需要客户端存储太多数量的 resident keys,这对于如 Yubikey 这样的 security keys 设备非常不友好,因为消费级 security keys 往往只有 10~20 个 private key slots。

https://laisky.notion.site/HD-Wallets-Explained-From-High-Level-to-Nuts-and-Bolts-44d109ed89e04bb79f993234f185848e?pvs=4

最近学习了 Hierarchical Deterministic Keys 结构。HD Keys 本质上是一种面向非对称密钥的 KDF(key derivation function)。它可以从一个 root private key 为根节点,通过添加一些 key material 生成新的 child key。

KDF 是一个确定性(deterministic)的函数,也就是相同的输出,始终能得出一样的结果。这一概念对于熟悉 KMS 的人而言并不陌生,其实所有的 KMS 都是只存储 master key 的。HD Keys 的主要特点就是支持了非对称密钥。

那么我们是否可以把 HD 和 passkey 结合起来,让用户只需要存储一个(或多个,增强安全性)root key,然后服务端存储 key derivation materials,这样用户依然可以做到不同网站使用不同的 child key,而同时又不需要存储大量的 resident keys?

#crypto Laisky's Notes
早上一来就修了个 bug。

Azure OAI 的响应格式有变化,以前可以通过 choices 为空来判定对话已结束。而现在 azure oai 会首先返回一个 choices 为空的响应(只包含 content filters 结果),会导致老程序误判会话已结束。

你需要 skip 这些 empty response,然后把有内容的响应拼接起来。我的套皮站最近可能遇到会话卡住没有响应的问题,就是这个原因,已修复。

如果各位有 azure oai 项目发现响应突然变成空了可以排查下…
https://laisky.notion.site/GPL-_-_-_-1222f285a5f04fc98af34b10614feb7e?pvs=4

很多人转这篇《最高人民法院:这份判决给软件开发者吃了定心丸》,稍微去看了下,感觉有点标题党。

原告基于 GPLv2 的开源项目二次开发了闭源商业软件,使用 socket/commandline 规避了 GPLv2 感染。被告窃取了原告的非开源商业代码,狡辩称这是 GPL 代码,可以使用。法院支持了原告的诉求,认定侵权事实成立。

侵权是发生于非开源商业代码,其实感觉和 GPLv2 没啥关系,又不是支持了开源代码的权利声明,而只是支持了软著的权利,没什么说服力,跟各位开源开发者也没什么关系。
https://laisky.notion.site/SwissMap-A-smaller-faster-Golang-Hash-Table-DoltHub-Blog-2fd1a48ab8a24e13ab9614409252ab9c?pvs=4

学习了一下 SwissTable,号称更快更轻的下一代 hash table。

一开始被 DoltHub 的这张 benchmark 图唬住了,内存接近于 array,吞吐居然还比 built-in map 快,太神奇了。仔细研究了一下源码后发现果然是幻觉,benchmark 的代码作弊了,因为频繁 rehash,把内存占用压缩到了极致,而 bench 中忽略了最耗时的 Put 操作,然后只呈现了 Get 的性能😓

hashmap 的结构大同小异,底层都是一个固定长度的 array,key 通过哈希函数定位到 array 的地址,然后取得值。Go built-in map 使用的是开地址法(open-hashing),即不同的 key 可能会被映射到同一个 array 地址,然后这些不同的 item 通过一组以链表串联的 bucket 来存储,每个 bucket 存放 8 个 item。

而 swisstable 使用闭散列法(closed-hashing),即每个 key 都会有一个唯一的地址,不会有冲突。拿 Find 来解释 swissTable 的原理:

1. 计算 key 的 hash 值,前 56-bits 称为 H1、后 8-bits 称为 H2
2. 通过 H1 计算得到 array 的 index,array 的每一个 item 为 128-bits 长,由 16 个 8-bits H2 组成
3. 使用 SIMD 指令,并行比较 16 个 8-bits 地址,可以得知 key 是否存在于当前桶
a. 如果 key 存在,完成查找
b. 如果 key 不存在,且这 16 个地址都非空,说明 key 可能溢出到了下一个桶,index+1,继续循环(probing)
c. 如果 key 不存在,且这 16 个地址中存在空,说明 key 不存在

总的来说,swissTable 最大的亮点就是利用了 SIMD 的并行计算能力,实际上它和 open-hashing 类似也有 buckets,只是每个 bucket 的容量是固定的 16 个(取决于 SIMD 指令的宽度),而且不像拉链法那样可以串联,这样可以用 SIMD 一次性比对完 bucket 内的全部 keys,提高了性能,而且还能充分利用缓存的局部性。

至于说它省内存,我倾向于认为只是因为它的 load factor 略高一些所带来的些微优势,而没有本质区别,要注意不要被一些第三方的虚假宣传骗了。 #algorithm
https://youtu.be/WXuK6gekU1Y?si=KnJ-WTTVCpgvEgT3

前阵子和人讨论 GPT 时聊到了 AlphaGo,我意识到我对 AlphaGo 不太了解,所以最近打算学习一下。而要了解 AlphaGo,首先都推荐观看这部纪录片。

2014 年深度学习(AlexNet)的论文发表,DeepMind 开始利用深度神经网络处理视频游戏,并很快转向了对围棋的研究。2015 年,DeepMind 邀请欧洲围棋冠军 Fan Hui 来到英国与 AlphaGo 对弈并全胜,这是围棋程序第一次战胜专业人类选手,Fan Hui 也以顾问的身份加入 AlphaGo。2016 年 DeepMind 前往韩国挑战世界冠军 Lee Sedol,并取得了四胜一负的成绩。这一系列的胜利引起了全球的关注,也让人们开始认识到了深度学习的威力。

值得注意的是,围棋的特色在于其近乎无穷的可能性,这也对应着近乎无穷的计算量,这使得围棋其实是一个直觉游戏(intuitive game),而不是一个需要深思熟虑的策略游戏(logic based game),毕竟任何所谓的深思熟虑在这无穷的可能性面前都是无谓的。专业棋手其实是通过记忆数以万计的棋谱来训练自己的直觉,然后使用直觉来对弈,这一训练方式和神经网络的工作原理非常相似,这也是深度神经网络最终能够击败人类的原因。

更多关于神经网络信息可以参考此前发过的介绍 GPT 的文: https://t.me/laiskynotes/144

我还在学习 AlphaGo 的论文,更多笔记日后再更新。
前几日逛宁波博物馆时看到纪念戚继光的文字,称他为“守护沿海居民的英雄”。

但其实明朝时期的倭寇主要都是由中国人组成的海商(海盗)集团,因为明朝实施海禁,东南亚地区庞大的海商集团失去了生存空间,其身份也就从海商变成了海盗。

戚继光执行的是中央王朝实施海禁的政策,实际上是妨碍了沿海居民与外界互通有无的贸易往来,而这肯定会让沿海居民的生活受到损害。做个不恰当的比喻,拿前几年的疫情来说,戚继光就是一个执行铁血封城的大白,而倭寇就是那些顶着风险跑外卖的黑骑手。戚继光杀伐果断地执行了封锁,中央王朝当然会把他当成英雄来纪念,但是作为普通居民,恐怕会有完全不同的感受。

网上搜一下有很多对“倭寇主要是中国人”这一说法的攻讦,但是列举的论点多为万历朝鲜战争(庆长文禄之役),这是在混淆视听,因为朝鲜战争是丰臣秀吉发起的侵略战争,性质和东南沿海的倭寇是完全不同的。此外,还有人列举日本浪人侵扰朝鲜的例子,这一点在《倭寇:海上历史》一书中有提及。朝鲜率先实施海禁,然后遭到了日本海商集团的侵扰,“倭寇”这一词也来自于此。后来明朝也实施海禁,然后也遇到了中国海商集团的侵扰,而且直接沿用了“倭寇”这一称谓。但实际上“倭寇”是一个泛称,并不特指日本人,洋人来华也被称为“倭寇”。

《倭寇:海上历史》这书就是详细追述了倭寇史在历史上的出现与变迁。
Telegram Channel