B站av和bv序列號(hào)的互換
轉(zhuǎn)載自知乎mcfx
留個(gè)底,以后用
由于字?jǐn)?shù)最低限制,把巨神的推到過程復(fù)制來
鏈接:https://www.zhihu.com/question/381784377/answer/1099438784
UPD:之前的代碼中,所有數(shù)位都被用到是亂湊的,實(shí)際上并不需要,目前只要低 6 位就足夠了。(更大的 av 號(hào)需要 64 位整數(shù)存儲(chǔ),但是 b 站現(xiàn)在使用的應(yīng)該還是 32 位整數(shù),所以應(yīng)該還要很久)
發(fā)現(xiàn)的方法:
首先從各種渠道的信息來看,應(yīng)該是 base58 編碼的。設(shè) x 是一個(gè)欽定的 av 號(hào),查詢 ?這些 av 號(hào)對(duì)應(yīng)的 bv 號(hào),發(fā)現(xiàn) bv 號(hào)的第 12、11、4、9、5 位分別會(huì)變化。所以猜測(cè)這些是 58 進(jìn)制下的相應(yīng)位。
但是直接 base58 是不行的,所以猜測(cè)異或了一個(gè)大數(shù),并且 base58 的字符表可能打亂了。經(jīng)過實(shí)驗(yàn),bv 號(hào)最低位相同的數(shù),av 號(hào)的奇偶性相同,這一定程度上印證了之前的猜想。
接下來找了一些 av 號(hào) x,滿足 x 和 x+1 對(duì)應(yīng) bv 號(hào)的第 11 位不同。設(shè)異或的數(shù)為 X,那么 ?( ??表示異或)。
由于 av 號(hào)(除了最新的少量視頻)最多只有 27 bits,所以可以設(shè) ?。然后可以發(fā)現(xiàn) ?只和 ?和 ?有關(guān),那么可以枚舉這兩個(gè)值(一共 ?種情況)然后使用上面的式子檢查,就能得到若干可能的 ?和 ?。
這里我得到的可能值如下:(左邊是 ?,右邊是 ?)
22 90983642
22 90983643
50 43234084
50 43234085
有奇有偶是因?yàn)楫惢?1 之后也能找到輪換表。而 ?則使得模 58 的余數(shù)剛好變成 ?減它。
我取了 b=43234084,然后處理最低位,可以得到一個(gè)字符表,即 fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF。
對(duì)于更高位,實(shí)際上還需要知道 ?,這些值也可以 枚舉 58 次得到,最后我得到的值是 ?。
這時(shí)我發(fā)現(xiàn),每一位的字符表是相同的(實(shí)際上只對(duì) b=43234084 是這樣的),然后再微調(diào)一下參數(shù)(上面代碼中的兩個(gè) magic number 就相當(dāng)于這里的 ?),最后處理了一下 ?的情況就得到了這份代碼
