多项认证。豫
yuyan · 314 行 · 20330 字节 · UTF-8
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314
「:
文言:多项认证者,取一三五零位素数 p=2^130-5 之上乘法群,逐块累乘而验消息也。
汉语:Poly1305(RFC 7539 §2.5 / RFC 8439 §2.5)一次性消息认证码。纯豫言,自研 26 位肢大整数(int64 仅六十四位,故以 B=2^26 为基数、五肢容一三零位)。
要点:p=2^130-5;r=clamp(key[0:16])、s=key[16:32];逐一六字节块 n=le(块)+2^(8*块长),acc=((acc+n)*r) mod p;tag=(acc+s) 取低一二八位小端一六字节。
关键:limb 积<2^52、累加<2^53 皆安于 int64;2^130=B^5 恰为整基数,故化约取低五肢为 Nlo、余为 Nhi,用 2^130≡5 化 Nlo+5*Nhi 再反复减 p。
:」
寻观「标准库」之书。
寻观「标准库」之「数据结构」之「整数操作」之书。
寻观「标准库」之「数据结构」之「字节串」之书。
「:文言:基数。汉语:基数 B=2^26=67108864,以 1024*65536 计之,免手抄大数之误。:」
「基数」乃化「有」而「整数」也。
「基数」者会「无」而「乘」于「一零二四」于「六五五三六」也。
「:文言:移位十八。汉语:2^18=262144,以 256*1024 计之。:」
「移位十八」乃化「有」而「整数」也。
「移位十八」者会「无」而「乘」于「二五六」于「一零二四」也。
「:文言:模数列。汉语:p=2^130-5 之五肢 [B-5,B-1,B-1,B-1,B-1],自低而高。:」
「模数列」乃化「有」而(「列」于「整数」)也。
「模数列」者会「无」而
虑「顶」者(「减」于(「基数」于「元」)于「五」)
而
虑「次」者(「减」于(「基数」于「元」)于「一」)
而
虑「末」者(「缀」授以「整数」于「次」于「罄」)
而
虑「四五」者(「缀」授以「整数」于「次」于「末」)
而
虑「三四」者(「缀」授以「整数」于「次」于「四五」)
而
虑「二三」者(「缀」授以「整数」于「次」于「三四」)
而「缀」授以「整数」于「顶」于「二三」
也。
「:文言:长度。汉语:列之长度。:」
「长度」乃化(「列」于「整数」)而「整数」也。
「长度」者会「列」而
鉴「列」而
有「罄」则「零」
或有(「缀」于「头」于「尾」)则「加」于「一」于(「长度」于「尾」)
或有「其他」则「零」
也。
「:文言:取肢。汉语:取第 i 肢,出列则零。:」
「取肢」乃化(「列」于「整数」)而化「整数」而「整数」也。
「取肢」者会「列」而会「i」而
鉴「列」而
有「罄」则「零」
或有(「缀」于「头」于「尾」)则
若「等零」于「i」则「头」否则「取肢」于「尾」于(「减」于「i」于「一」)
或有「其他」则「零」
也。
「:文言:取前。汉语:取前 k 肢。:」
「取前」乃化(「列」于「整数」)而化「整数」而(「列」于「整数」)也。
「取前」者会「列」而会「k」而
若「等零」于「k」则「罄」
否则
鉴「列」而
有「罄」则「罄」
或有(「缀」于「头」于「尾」)则「缀」授以「整数」于「头」于(「取前」于「尾」于(「减」于「k」于「一」))
或有「其他」则「罄」
也。
「:文言:取后。汉语:取自第 k 肢起之所有肢。:」
「取后」乃化(「列」于「整数」)而化「整数」而(「列」于「整数」)也。
「取后」者会「列」而会「k」而
若「等零」于「k」则「列」
否则
鉴「列」而
有「罄」则「罄」
或有(「缀」于「头」于「尾」)则「取后」于「尾」于(「减」于「k」于「一」)
或有「其他」则「列」
也。
「:文言:反转累。汉语:逐头累缀而成反转列。:」
「反转累」乃化(「列」于「整数」)而化(「列」于「整数」)而(「列」于「整数」)也。
「反转累」者会「列」而会「积」而
鉴「列」而
有「罄」则「积」
或有(「缀」于「头」于「尾」)则「反转累」于「尾」于(「缀」授以「整数」于「头」于「积」)
或有「其他」则「积」
也。
「:文言:反转。汉语:列反转(累缀成逆,故边界处用以正序)。:」
「反转」乃化(「列」于「整数」)而(「列」于「整数」)也。
「反转」者会「列」而「反转累」于「列」于「罄」也。
「:文言:加法累。汉语:两肢列相加,进位传播。:」
「加累」乃化(「列」于「整数」)而化(「列」于「整数」)而化「整数」而化「整数」而化「整数」而化(「列」于「整数」)而(「列」于「整数」)也。
「加累」者会「甲」而会「乙」而会「i」而会「n」而会「进」而会「积」而
若「等」于「i」于「n」则
若「等零」于「进」则「积」否则「缀」授以「整数」于「进」于「积」
否则
虑「和」者(「加」于(「加」于(「取肢」于「甲」于「i」)于(「取肢」于「乙」于「i」))于「进」)
而
虑「商」者(「除以」于「和」于(「基数」于「元」))
而「加累」于「甲」于「乙」于(「加」于「i」于「一」)于「n」于「商」于(「缀」授以「整数」于(「减」于「和」于(「乘」于「商」于(「基数」于「元」)))于「积」)
也。
「:文言:加法。汉语:两肢列相加。:」
「加甲乙」乃化(「列」于「整数」)而化(「列」于「整数」)而(「列」于「整数」)也。
「加甲乙」者会「甲」而会「乙」而
虑「la」者(「长度」于「甲」)
而
虑「lb」者(「长度」于「乙」)
而
虑「n」者(若「大于」于「la」于「lb」则「la」否则「lb」)
而「反转」于(「加累」于「甲」于「乙」于「零」于「n」于「零」于「罄」)
也。
「:文言:减法累。汉语:两肢列相减,借位传播(设甲不小于乙)。:」
「减累」乃化(「列」于「整数」)而化(「列」于「整数」)而化「整数」而化「整数」而化「整数」而化(「列」于「整数」)而(「列」于「整数」)也。
「减累」者会「甲」而会「乙」而会「i」而会「n」而会「借」而会「积」而
若「等」于「i」于「n」则「积」
否则
虑「差」者(「减」于(「减」于(「取肢」于「甲」于「i」)于(「取肢」于「乙」于「i」))于「借」)
而
若「小于」于「差」于「零」
则「减累」于「甲」于「乙」于(「加」于「i」于「一」)于「n」于「一」于(「缀」授以「整数」于(「加」于「差」于(「基数」于「元」))于「积」)
否则「减累」于「甲」于「乙」于(「加」于「i」于「一」)于「n」于「零」于(「缀」授以「整数」于「差」于「积」)
也。
「:文言:减法。汉语:两肢列相减。:」
「减甲乙」乃化(「列」于「整数」)而化(「列」于「整数」)而(「列」于「整数」)也。
「减甲乙」者会「甲」而会「乙」而
虑「la」者(「长度」于「甲」)
而
虑「lb」者(「长度」于「乙」)
而
虑「n」者(若「大于」于「la」于「lb」则「la」否则「lb」)
而「反转」于(「减累」于「甲」于「乙」于「零」于「n」于「零」于「罄」)
也。
「:文言:乘小肢累。汉语:肢列乘以小于基数之小整数,进位传播。:」
「乘单累」乃化(「列」于「整数」)而化「整数」而化「整数」而化「整数」而化「整数」而化(「列」于「整数」)而(「列」于「整数」)也。
「乘单累」者会「列」而会「k」而会「i」而会「n」而会「进」而会「积」而
若「等」于「i」于「n」则
若「等零」于「进」则「积」否则「缀」授以「整数」于「进」于「积」
否则
虑「积值」者(「加」于(「乘」于(「取肢」于「列」于「i」)于「k」)于「进」)
而
虑「商」者(「除以」于「积值」于(「基数」于「元」))
而「乘单累」于「列」于「k」于(「加」于「i」于「一」)于「n」于「商」于(「缀」授以「整数」于(「减」于「积值」于(「乘」于「商」于(「基数」于「元」)))于「积」)
也。
「:文言:乘小肢。汉语:肢列乘以小整数。:」
「乘单」乃化(「列」于「整数」)而化「整数」而(「列」于「整数」)也。
「乘单」者会「列」而会「k」而
虑「n」者(「长度」于「列」)
而「反转」于(「乘单累」于「列」于「k」于「零」于「n」于「零」于「罄」)
也。
「:文言:乘积。汉语:两肢列相乘(大数乘),以乙之肢逐位乘单再加。:」
「乘积」乃化(「列」于「整数」)而化(「列」于「整数」)而(「列」于「整数」)也。
「乘积」者会「甲」而会「乙」而
鉴「乙」而
有「罄」则「罄」
或有(「缀」于「乙头」于「乙尾」)则「加甲乙」于(「乘单」于「甲」于「乙头」)于(「缀」授以「整数」于「零」于(「乘积」于「甲」于「乙尾」))
或有「其他」则「罄」
也。
「:文言:比同。汉语:等长肢列自高肢比较(爻:甲不小于乙)。:」
「比同」乃化(「列」于「整数」)而化(「列」于「整数」)而化「整数」而「爻」也。
「比同」者会「甲」而会「乙」而会「i」而
若「小于」于「i」于「零」则「阳」
否则
虑「x」者(「取肢」于「甲」于「i」)
而
虑「y」者(「取肢」于「乙」于「i」)
而
若「大于」于「x」于「y」则「阳」
否则若「小于」于「x」于「y」则「阴」
否则「比同」于「甲」于「乙」于(「减」于「i」于「一」)
也。
「:文言:比。汉语:比较甲不小于乙(爻)。:」
「比」乃化(「列」于「整数」)而化(「列」于「整数」)而「爻」也。
「比」者会「甲」而会「乙」而
虑「la」者(「长度」于「甲」)
而
虑「lb」者(「长度」于「乙」)
而
若「大于」于「la」于「lb」则「阳」
否则若「小于」于「la」于「lb」则「阴」
否则「比同」于「甲」于「乙」于(「减」于「la」于「一」)
也。
「:文言:化到小。汉语:反复减 p 直至小于 p。:」
「化到小」乃化(「列」于「整数」)而(「列」于「整数」)也。
「化到小」者会「t」而
若「比」于「t」于(「模数列」于「元」)
则「化到小」于(「减甲乙」于「t」于(「模数列」于「元」))
否则「t」
也。
「:文言:化约。汉语:以 2^130≡5 化 c 为 c 对 p 之余。取低五肢 Nlo、余 Nhi,成 Nlo+5*Nhi 再减 p 至小。:」
「化约」乃化(「列」于「整数」)而(「列」于「整数」)也。
「化约」者会「c」而
虑「lo」者(「取前」于「c」于「五」)
而
虑「hi」者(「取后」于「c」于「五」)
而「化到小」于(「加甲乙」于「lo」于(「乘单」于「hi」于「五」))
也。
「:文言:右移八累。汉语:肢列右移八位(供逐字节提取)。:」
「右八累」乃化(「列」于「整数」)而化「整数」而化「整数」而化(「列」于「整数」)而(「列」于「整数」)也。
「右八累」者会「列」而会「i」而会「n」而会「积」而
若「等」于「i」于「n」则「积」
否则
虑「高」者(「取肢」于「列」于(「加」于「i」于「一」))
而
虑「低八高」者(「减」于「高」于(「乘」于(「除以」于「高」于「二五六」)于「二五六」))
而
虑「新」者(「加」于(「除以」于(「取肢」于「列」于「i」)于「二五六」)于(「乘」于「低八高」于(「移位十八」于「元」)))
而「右八累」于「列」于(「加」于「i」于「一」)于「n」于(「缀」授以「整数」于(「减」于「新」于(「乘」于(「除以」于「新」于(「基数」于「元」))于(「基数」于「元」)))于「积」)
也。
「:文言:右移八。汉语:肢列右移八位。:」
「右八」乃化(「列」于「整数」)而(「列」于「整数」)也。
「右八」者会「列」而
虑「n」者(「长度」于「列」)
而「反转」于(「右八累」于「列」于「零」于「n」于「罄」)
也。
「:文言:位累。汉语:以 256 连乘 n 次自 1 起,成 2^(8*n)。:」
「位累」乃化「整数」而化(「列」于「整数」)而(「列」于「整数」)也。
「位累」者会「n」而会「列」而
若「等零」于「n」则「列」否则「位累」于(「减」于「n」于「一」)于(「乘单」于「列」于「二五六」)
也。
「:文言:位。汉语:2^(8*n)。:」
「位」乃化「整数」而(「列」于「整数」)也。
「位」者会「n」而「位累」于「n」于(「缀」授以「整数」于「一」于「罄」)也。
「:文言:块转数累。汉语:取字节串自 start 起 count 字节,小端成数。:」
「块转累」乃化「字节串」而化「整数」而化「整数」而化「整数」而化(「列」于「整数」)而化(「列」于「整数」)而(「列」于「整数」)也。
「块转累」者会「串」而会「起」而会「数」而会「i」而会「积」而会「幂」而
若「等」于「i」于「数」则「积」
否则
虑「b」者(「字节串取字节」于「串」于(「加」于「起」于「i」))
而「块转累」于「串」于「起」于「数」于(「加」于「i」于「一」)于(「加甲乙」于「积」于(「乘单」于「幂」于「b」))于(「乘单」于「幂」于「二五六」)
也。
「:文言:块转数。汉语:取字节串一段小端成数。:」
「块转数」乃化「字节串」而化「整数」而化「整数」而(「列」于「整数」)也。
「块转数」者会「串」而会「起」而会「数」而「块转累」于「串」于「起」于「数」于「零」于「罄」于(「缀」授以「整数」于「一」于「罄」)也。
「:文言:数转字节串累。汉语:取数低一二八位,小端逐字节累积。:」
「数转累」乃化(「列」于「整数」)而化「整数」而化「字节串」而「字节串」也。
「数转累」者会「n」而会「i」而会「积」而
若「等」于「i」于「一六」则「积」
否则
虑「b」者(「减」于(「取肢」于「n」于「零」)于(「乘」于(「除以」于(「取肢」于「n」于「零」)于「二五六」)于「二五六」))
而「数转累」于(「右八」于「n」)于(「加」于「i」于「一」)于(「拼接字节串」于「积」于(「单字节串」于「b」))
也。
「:文言:数转字节串。汉语:取数低一二八位小端成一六字节串。:」
「数转字节串」乃化(「列」于「整数」)而「字节串」也。
「数转字节串」者会「n」而「数转累」于「n」于「零」于(「空字节串」于「元」)也。
「:文言:与零f。汉语:字节按 0x0f 清顶四位。:」
「与零f」乃化「整数」而「整数」也。
「与零f」者会「x」而「减」于「x」于(「乘」于(「除以」于「x」于「一六」)于「一六」)也。
「:文言:与零fc。汉语:字节按 0xfc 清底两位。:」
「与零fc」乃化「整数」而「整数」也。
「与零fc」者会「x」而「减」于「x」于(「减」于「x」于(「乘」于(「除以」于「x」于「四」)于「四」))也。
「:文言:取掩字节。汉语:clamp——三、七、一一、一五四位清顶,四、八、一二二位清底,余不动。:」
「取掩字节」乃化「字节串」而化「整数」而「整数」也。
「取掩字节」者会「串」而会「i」而
虑「x」者(「字节串取字节」于「串」于「i」)
而
若「等」于「i」于「三」则「与零f」于「x」
否则若「等」于「i」于「七」则「与零f」于「x」
否则若「等」于「i」于「一一」则「与零f」于「x」
否则若「等」于「i」于「一五」则「与零f」于「x」
否则若「等」于「i」于「四」则「与零fc」于「x」
否则若「等」于「i」于「八」则「与零fc」于「x」
否则若「等」于「i」于「一二」则「与零fc」于「x」
否则「x」
也。
「:文言:取掩串累。汉语:逐字节 clamp。:」
「取掩累」乃化「字节串」而化「整数」而化「字节串」而「字节串」也。
「取掩累」者会「串」而会「i」而会「积」而
若「等」于「i」于「一六」则「积」
否则「取掩累」于「串」于(「加」于「i」于「一」)于(「拼接字节串」于「积」于(「单字节串」于(「取掩字节」于「串」于「i」)))
也。
「:文言:取掩串。汉语:以 clamp 成 key 首一六字节之掩串。:」
「取掩串」乃化「字节串」而「字节串」也。
「取掩串」者会「串」而「取掩累」于「串」于「零」于(「空字节串」于「元」)也。
「:文言:多项累。汉语:逐块 acc=((acc+n+2^(8*块长))*r) mod p。:」
「多项累」乃化「字节串」而化「整数」而化(「列」于「整数」)而化(「列」于「整数」)而(「列」于「整数」)也。
「多项累」者会「串」而会「i」而会「r」而会「acc」而
虑「总」者(「字节串长度」于「串」)
而
若「小于」于「i」于「总」
则
虑「余」者(「减」于「总」于「i」)
而
虑「块长」者(若「大于」于「余」于「一六」则「一六」否则「余」)
而
虑「n」者(「块转数」于「串」于「i」于「块长」)
而
虑「mark」者(「位」于「块长」)
而「多项累」于「串」于(「加」于「i」于「一六」)于「r」于(「化约」于(「乘积」于(「加甲乙」于(「加甲乙」于「acc」于「n」)于「mark」)于「r」))
否则「acc」
也。
「:文言:多项认证。汉语:Poly1305 主入口,返一六字节小端 tag。:」
「多项认证」乃化「字节串」而化「字节串」而「字节串」也。
「多项认证」者会「key」而会「msg」而
虑「r串」者(「取掩串」于「key」)
而
虑「r」者(「块转数」于「r串」于「零」于「一六」)
而
虑「s」者(「块转数」于「key」于「一六」于「一六」)
而
「数转字节串」于(「加甲乙」于(「多项累」于「msg」于「零」于「r」于「罄」)于「s」)
也。