Follow is a newly released RSS reader that is currently in beta testing and requires an invitation to gain access. Initially, invitation codes can only be obtained through official channels, such as the official team distributing a certain number of codes periodically on Discord and X, or you can directly email the official team or send them a private message to obtain an invitation code.
At the same time, users who already have and have activated invitation codes can invite other users, leading to a viral spread of invitation codes.
- Check in daily to earn 20 powers; accumulate 100 powers to mint an invitation code.
- You can obtain one invitation code generation qualification every 3 days.
- Authenticating a subscription source directly grants you 100 powers, so a new user can generate a new invitation code in as little as 3 days.
New invitation codes generated by users generally have the following destinations:
- Invite friends and family
- Social media likes, comments, and giveaways, inviting lucky netizens (available on X, Xiaohongshu, Bilibili, etc.)
- As a solution to a riddle, "marriage competition"
- Second-hand market
If you don't know anyone who can generate an invitation code for you and don't have enough luck to win one in a draw among hundreds or thousands of people, then your source for obtaining an invitation code comes from Discord, where many users post their generated invitation codes. Since directly posting invitation codes can be snatched up by unscrupulous users using scripts, people usually modify the invitation codes in some way, such as providing the code in image form to test speed, or hiding one or two digits to test luck. Such invitation codes typically last less than five minutes.
To add an element of fun, people have started encrypting invitation codes in special ways, reminiscent of a "marriage competition." Some encrypt invitation codes using special encoding, some require solving puzzles to derive the invitation code, some use images and text for encryption, and others hide the invitation code within a story. During this time, I have been watching various decryptions that appear daily, and gradually I have been able to solve some of the puzzles. However, since there are always people who solve them faster, I have never managed to obtain an invitation code through decryption. In the end, I got lucky and guessed an invitation code correctly. I have recorded some interesting decryptions as a memento of this time.
Image and Text Encryption#
This encryption method looks very abstract at first glance and requires a good understanding of commonly used content in image and text encryption, as well as creative thinking.
Pixel Art, Braille, Vigenere#
From @cap_stu
Hint 1: Using Photoshop is helpful
Hint 2: SOS
Hint 3: Two image ratios 1:800
Hint 4: An image with the word follow written on it
When this puzzle was released, only the first three hints were given, which were too abstract to provide any clues. By the next day, no one had solved it, so the author provided hint four, and only then did I notice some clues.
- First, look at hint four; below is the icon for the follow software, and above are six blocks of content. Associating this with Braille, I checked the table and found that the six blocks represent follow, confirming that the puzzle uses Braille encryption.
- Decoding the stars above the puzzle image in Braille yields
VIGENERE
andPIXEL
. This indicates that another encryption method, Vigenere, is also needed, with the key being pixel. - The two gray lines at the top and bottom of the icon at the bottom of the puzzle can be decoded using Morse code, yielding Braille and Vigenere, which should have been hidden hints by the author before hint four was given.
- The two segments of gray ciphertext in the middle of the puzzle, when decoded using Morse code, yield
DRNAQXSDDQA
. At this point, Vigenere comes into play, and decoding it gives the final answer.
Braille Encryption: Replace to Decode | Vigenere Encryption: Decode with Key Pixel |
---|---|
Attached is an illustration made by the author.
3D Graphics#
From @Plana
Puzzle:
37.06749647,44.28503693,-40.50114678
39.18881682,45.3456971,-38.66402947
42.72435072,47.11346406,-35.60216729
63.93755416,57.72006577,-17.23099422
81.61522369,66.55890054,-1.921683328
...
The author provided a lot of such data, which is a CSV file. Since the data is in groups of three, it was speculated to be RGB, but the author said it is not. Therefore, it was inferred to be XYZ coordinates. Using Python to plot the result yields:
Genshin Impact Encryption#
The Teyvat language from Genshin Impact.
The codebook is as follows, and the answer is sf4lBGG_7E.
Dancing People, Color Blocks, Tektite Language#
From @喵~
Not difficult; knowing the codebook is enough to solve it. The problem is that the author provided the wrong image, not distinguishing between uppercase and lowercase, and directly decoding yields EXSTCTTJKU. Fortunately, I guessed it right as eXsTCtTkKu, successfully activating it.
https://www.dcode.fr/ballet-alphabet
https://www.dcode.fr/hexahue-cipher
https://www.dcode.fr/tenctonese-alphabet
Moon, Base Conversion#
From @Jacob
- Hint 1: Moon + Text + Red = full code (implying that the code is a combination of three segments)
- Hint 2: Look closely; the two moons are different (the moon is the Lunar Alphabet, deciphering yields the first two letters)
- Hint 3: The numbers resemble "eight-part essay" (the numbers in the image suggest octal conversion, deciphering yields the second segment)
- Hint 4: The red line concludes (the only line that appears in the code is the underscore _ for the third segment)
Decoding the puzzle:
- The moon should be decoded using the lunar phase, yielding
VD
- The image has four lines of numbers in the middle, which are quite large, as the numbers are in octal. Converting the octal numbers to hexadecimal and then using Unicode encoding yields the answer: 【The two moon deities guide you to the dark side of the moon 5xGivZb red object】, revealing that the seven middle characters are
5xGivZb
- The remaining red line is naturally the underscore
_
Thus, the invitation code obtained is: VD5xGivZb_
Conan Decryption#
From @Arona
AESDecrypt(data="vEIlU835MIeD08frTJmJpw==", "ECB", "PKCS7", "128bit", key=guess the image)
The original question does not include the numbers on the left and the letters below, and decoding yields EGG HEAD
, which was originally the key, but the author copied it incorrectly during encryption, so this cannot yield an invitation code.
Birds on Wires, Vigenere Encryption#
From @Jacob
Double encryption, the first layer is the birds on wires, with the codebook being the image below (search for The bird on the telephone pole decrypt or similar content to find https://www.dcode.fr/birds-on-a-wire-cipher), the position of the birds represents the case of the letters.
Decoding yields bHPwBTSiji, then using Vigenere to decode with the key being the software name represented by the image, follow, yields the answer wTElNXNuyx
.
Encoding Encryption#
This encryption usually requires knowing the ciphertext, key, and encryption method to decode.
Zero-width-web, SVG, QR Code#
From @Huajin, yes, this is my output.
Ciphertext:
M
- Hint 1: Double encryption
- Hint 2: f12, https://yuanfux.github.io/zero-width-web
- Hint 3: SVG
If you copy the ciphertext into WeChat or VSCode, you will find some characters that cannot be displayed. This is because this ciphertext hides zero-width characters. Using the tool provided in hint 2, the first layer of decryption can be completed to obtain the real ciphertext.
M4 4.5h7m1 0h2m4 0h7M4 5.5h1m5 0h1m1 0h3m3 0h1m5 0h1M4 6.5h1m1 0h3m1 0h1m1 0h3m3 0h1m1 0h3m1 0h1M4 7.5h1m1 0h3m1 0h1m3 0h2m2 0h1m1 0h3m1 0h1M4 8.5h1m1 0h3m1 0h1m1 0h1m1 0h1m1 0h1m1 0h1m1 0h3m1 0h1M4 9.5h1m5 0h1m3 0h3m1 0h1m5 0h1M4 10.5h7m1 0h1m1 0h1m1 0h1m1 0h7M13 11.5h4M4 12.5h1m2 0h6m1
0h1m1 0h2m2 0h1m1 0h3M4 13.5h5m3 0h2m2 0h1m4 0h1M10 14.5h3m4 0h2m2 0h4M4 15.5h1m1 0h1m1 0h1m3 0h1m1 0h2m1 0h1m4 0h1m1 0h1M5 16.5h7m8 0h2m2 0h1M12 17.5h6m2 0h1m1 0h1m1 0h1M4 18.5h7m1 0h3m1 0h2m2 0h1M4 19.5h1m5 0h1m1 0h1m2 0h4m2 0h2M4 20.5h1m1 0h3m1 0h1m1 0h2m1 0h2m1 0h1M4 21.5h1m1 0h3m1 0h1m1 0h2m1 0h5m2 0h1M4 22.5h1m1 0h3m1 0h1m6 0h1m1 0h2m2 0h2M4 23.5h1m5 0h1m3 0h1m2 0h3m1 0h4M4 24.5h7m1 0h1m1 0h2m1 0h1m1 0h1m1 0h2
By combining these two segments of ciphertext, you can see a lot of h and m. If you are familiar with SVG, you can immediately tell that this is an SVG path tag. Just search for any <svg>
, and with the decrypted result <path d="..."/>
, we get an SVG. Opening it reveals a QR code.
<svg viewBox="0 0 33 33" shape-rendering="crispEdges">
<path stroke="#fff"
d="M4 4.5h7m1 0h2m4 0h7M4 5.5h1m5 0h1m1 0h3m3 0h1m5 0h1M4 6.5h1m1 0h3m1 0h1m1 0h3m3 0h1m1 0h3m1 0h1M4 7.5h1m1 0h3m1 0h1m3 0h2m2 0h1m1 0h3m1 0h1M4 8.5h1m1 0h3m1 0h1m1 0h1m1 0h1m1 0h1m1 0h1m1 0h3m1 0h1M4 9.5h1m5 0h1m3 0h3m1 0h1m5 0h1M4 10.5h7m1 0h1m1 0h1m1 0h1m1 0h7M13 11.5h4M4 12.5h1m2 0h6m1 0h1m1 0h2m2 0h1m1 0h3M4 13.5h5m3 0h2m2 0h1m4 0h1M10 14.5h3m4 0h2m2 0h4M4 15.5h1m1 0h1m1 0h1m3 0h1m1 0h2m1 0h1m4 0h1m1 0h1M5 16.5h7m8 0h2m2 0h1M12 17.5h6m2 0h1m1 0h1m1 0h1M4 18.5h7m1 0h3m1 0h2m2 0h1M4 19.5h1m5 0h1m1 0h1m2 0h4m2 0h2M4 20.5h1m1 0h3m1 0h1m1 0h2m1 0h2m1 0h1M4 21.5h1m1 0h3m1 0h1m1 0h2m1 0h5m2 0h1M4 22.5h1m1 0h3m1 0h1m6 0h1m1 0h2m2 0h2M4 23.5h1m5 0h1m3 0h1m2 0h3m1 0h4M4 24.5h7m1 0h1m1 0h2m1 0h1m1 0h1m1 0h2" />
</svg>
You can also slightly beautify it by changing the background color to white and the color blocks to black.
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 29 29" shape-rendering="crispEdges">
<path fill="#ffffff" d="M0 0h29v29H0z" />
<path stroke="#000000"
d="M4 4.5h7m1 0h2m4 0h7M4 5.5h1m5 0h1m1 0h3m3 0h1m5 0h1M4 6.5h1m1 0h3m1 0h1m1 0h3m3 0h1m1 0h3m1 0h1M4 7.5h1m1 0h3m1 0h1m3 0h2m2 0h1m1 0h3m1 0h1M4 8.5h1m1 0h3m1 0h1m1 0h1m1 0h1m1 0h1m1 0h1m1 0h3m1 0h1M4 9.5h1m5 0h1m3 0h3m1 0h1m5 0h1M4 10.5h7m1 0h1m1 0h1m1 0h1m1 0h7M13 11.5h4M4 12.5h1m2 0h6m1 0h1m1 0h2m2 0h1m1 0h3M4 13.5h5m3 0h2m2 0h1m4 0h1M10 14.5h3m4 0h2m2 0h4M4 15.5h1m1 0h1m1 0h1m3 0h1m1 0h2m1 0h1m4 0h1m1 0h1M5 16.5h7m8 0h2m2 0h1M12 17.5h6m2 0h1m1 0h1m1 0h1M4 18.5h7m1 0h3m1 0h2m2 0h1M4 19.5h1m5 0h1m1 0h1m2 0h4m2 0h2M4 20.5h1m1 0h3m1 0h1m1 0h2m1 0h2m1 0h1M4 21.5h1m1 0h3m1 0h1m1 0h2m1 0h5m2 0h1M4 22.5h1m1 0h3m1 0h1m6 0h1m1 0h2m2 0h2M4 23.5h1m5 0h1m3 0h1m2 0h3m1 0h4M4 24.5h7m1 0h1m1 0h2m1 0h1m1 0h1m1 0h2" />
</svg>
Scanning the QR code, you get the invitation code: VlbwY6fixN
.
AES Encryption#
From @Oganneson
Ciphertext: YDY/4rmwped3BwBS8PYZjg==
, AES 128-bit encryption, CBC mode, PKCS7 padding, with the key and initialization vector being the same.
This is not simple ciphertext; using the console, you can see that there are many zero-width characters inside.
Using https://yuanfux.github.io/zero-width-web to decrypt removes the zero-width characters while obtaining the real ciphertext YDY/4rmwped3BwBS8PYZjg==
and the key bMfNvN74N8Kkd83p
, then you can use any AES decryption tool to obtain the invitation code.
Zen Buddhism Discussion#
From @Charles Ye
Puzzle: The Buddha said: "Victory, nephew, punishment, overturning, white, fear, bowl, far, obtain, contempt, Muji, Buddha, monk, shining, nephew, contempt, punishment, Luo, dark, fear, nephew, luxury, one, Nirvana, dream, do, fear, white, Jia, Xi, all, nephew, also, Brahman, participate, Na, Pan, no more."
Solution: It is obvious that this is encrypted with Zen Buddhism discussion; just search for a puzzle-solving website related to Zen Buddhism discussion to decrypt.
New Buddha Said Encryption#
From @dirt
New Buddha said: "All subordinate monks fear, fall, fear, hum, all fear, punishment, subordinate monks, bowl, Saha, fear, wish, fear, fall, curse, pity, fear, truth, subordinate, fear, wisdom, hum, fear, robbery, fear, Ah, is, honey, like."
Solution: A variant of Zen Buddhism discussion; you can decrypt using this website http://hi.pcmoe.net/Buddha.html.
Caesar Encryption#
From @neoedon
Puzzle: cRIrROPj5I has been Caesar encrypted, with an offset of 3, 5, 7, 9, 11, or 13; decrypt to obtain the invitation code.
Solution: The encryption method is known; just search for a puzzle-solving website that can decrypt Caesar encryption, mainly relying on luck.
ASCII, Base Conversion, Offset#
From @cliouo
In an ancient castle, a mysterious letter is hidden. The letter begins with a string of encrypted characters:
65,171,142,147,161,40,153,164,161,161,164,142,152,151,40,147,144,40,154,70,162,161,124
The guardian of the castle tells you that this text uses a simple substitution encryption method, and you need to decrypt this text to find the key to the treasure.
Hint:
The first character of the invitation code is the number N, and this text uses a simple substitution encryption method.
Each letter has been replaced with the letter that is N positions forward in the alphabet.
Please decrypt this text and find the key to the treasure.
Solution: The numbers are octal ASCII codes; convert each value from octal to decimal, then look up its corresponding ASCII character. If it is a letter, offset by 5 (the first character is found to be 5).
XTEA Encryption, App#
From @Deco
Ciphertext One: Zv2DGQAG2q+57dtXshJlzk7msqCY3M1LOU453/fLLboPUWiTUqmAs1iLbIvDkh7TvF1s
Ciphertext Two (partial): Zv2DNQAJMOMfrw6ycIdOxF/meq9M5vf5
- Hint 1: XTEA encryption
- Hint 2: The key is all the app names in lowercase
- Hint 3: The first puzzle's key hint: Drank way too much coffee
- Hint 4: The first puzzle's result yields the key hint for the second puzzle.
Solution: The encryption method is known; you just need to guess the key. The first key hint's content is youtube, and the hint's content is the app's update announcement. The result of the decryption is: "Fixed some bugs and ate a bucket of ice cream," which is the update announcement content during the bilibili update, serving as the second puzzle's ciphertext's latter part, with the key being bilibili. This way, you can obtain the result.
Emoticon Encryption#
The ciphertext is very abstract, but this is not difficult; just search for any tool to decrypt it.
゚ω゚ノ= /`m´)ノ ~┻━┻ //´∇`/ ['']; o=(゚ー゚) ==3; c=(゚Θ゚) =(゚ー゚)-(゚ー゚); (゚Д゚) =(゚Θ゚)= (o^^o)/ (o^^o);(゚Д゚)={゚Θ゚: '' ,゚ω゚ノ : ((゚ω゚ノ==3) +'') [゚Θ゚] ,゚ー゚ノ :(゚ω゚ノ+ '')[o^^o -(゚Θ゚)] ,゚Д゚ノ:((゚ー゚==3) +'')[゚ー゚] }; (゚Д゚) [゚Θ゚] =((゚ω゚ノ==3) +'') [c^^o];(゚Д゚) ['c'] = ((゚Д゚)+'') [ (゚ー゚)+(゚ー゚)-(゚Θ゚) ];(゚Д゚) ['o'] = ((゚Д゚)+'') [゚Θ゚];(゚o゚)=(゚Д゚) ['c']+(゚Д゚) ['o']+(゚ω゚ノ +'')[゚Θ゚]+ ((゚ω゚ノ==3) +'') [゚ー゚] + ((゚Д゚) +'') [(゚ー゚)+(゚ー゚)]+ ((゚ー゚==3) +'') [゚Θ゚]+((゚ー゚==3) +'') [(゚ー゚) - (゚Θ゚)]+(゚Д゚) ['c']+((゚Д゚)+'') [(゚ー゚)+(゚ー゚)]+ (゚Д゚) ['o']+((゚ー゚==3) +'') [゚Θ゚];(゚Д゚) [''] =(o^^o) [゚o゚] [゚o゚];(゚ε゚)=((゚ー゚==3) +'') [゚Θ゚]+ (゚Д゚) .゚Д゚ノ+((゚Д゚)+'') [(゚ー゚) + (゚ー゚)]+((゚ー゚==3) +'') [o^^o -゚Θ゚]+((゚ー゚==3) +'') [゚Θ゚]+ (゚ω゚ノ +'') [゚Θ゚]; (゚ー゚)+=(゚Θ゚); (゚Д゚)[゚ε゚]='\'; (゚Д゚).゚Θ゚ノ=(゚Д゚+ ゚ー゚)[o^^o -(゚Θ゚)];(o゚ー゚o)=(゚ω゚ノ +'')[c^^o];(゚Д゚) [゚o゚]='"';(゚Д゚) [''] ( (゚Д゚) [''] (゚ε゚+(゚Д゚)[゚o゚]+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o^^o) +(o^^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (c^^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚Θ゚)+ ((o^^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (o^^o)+ ((o^^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((o^^o) +(o^^o))+ ((゚ー゚) + (o^^o))+ (゚Д゚)[゚ε゚]+((o^^o) +(o^^o))+ ((゚ー゚) + (o^^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚Θ゚)+ ((o^^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚Θ゚)+ (c^^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚Θ゚)+ ((゚ー゚) + (o^^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚Θ゚)+ (c^^o)+ (゚Д゚)[゚o゚]) (゚Θ゚)) ('');
Beast Language Encryption#
From @QistChan
~呜嗷嗷嗷嗷呜呜呜啊嗷呜嗷呜呜啊呜啊嗷啊呜~呜嗷呜~嗷~呜呜嗷嗷~嗷嗷嗷呜呜呜啊嗷呜嗷呜呜啊呜嗷嗷啊嗷啊呜~呜~嗷~呜呜嗷嗷~嗷嗷嗷呜呜呜啊啊呜嗷呜呜啊呜~啊啊嗷啊呜~呜~啊~嗷~呜嗷呜呜嗷啊
ps. Due to the presence of the symbol ~
in the ciphertext, when posted on Discord, many strikethroughs occur.
Just replace the strikethroughs with ~, which is to convert using markdown syntax, and then use https://roar.iiilab.com/ to decrypt. After decryption, convert the result to ASCII characters in hexadecimal.
Morse Code#
From @LOOL
6 uppercase, 1 2 7 9 lowercase.
Decoded: cuKNXEwSvW
Prime Number Encryption/Decryption#
From @Jacob
This is a basic decryption; successfully decrypting requires posting the answer in the DC chat, and the first person to answer correctly will privately receive an invitation code.
19 71 71 53 67 71 11 43 47 61 5 47 41 79 23 11 83 3 2 23 37 2 61 7 2 43 5 11 19 2 53 53 97 71 47 41 2 43 7 29 11 61 61 97 17 23 13
Hint: There is only one layer of encryption.
Observing the numbers, it is easy to find that they are all prime numbers. By converting the ciphertext into letters according to the order of the prime numbers, we get:
Letter | Prime |
---|---|
a | 2 |
b | 3 |
c | 5 |
... | ... |
z | 101 |
httpstenorcomviewbailardancehappytomandjerrygif
The corresponding website seems to be https://tenor.com/view/bailar-dance-happy-tom-and-jerry-gif
. However, upon opening, it turns out to be a blank page on the tenor website. The real answer still needs to be pieced together with a string of numbers from the author's personal profile 14081211
. Therefore, the true answer is:
https://tenor.com/view/bailar-dance-happy-tom-and-jerry-gif-14081211
The corresponding gif is tom and jerry.
Puzzle Solving Encryption#
Advanced Mathematics#
From @Jonty Li, ① and ② correspond to the respective sequence numbers of the English letters.
The result is 6 and 3, corresponding to j and c, with the answer being ymyjfSgmMc.
Poetry#
From @toxomo
The myriad families' lights are bright, the world celebrates together.
A couplet, rhyming, with each character used only once.
Solution: The myriad families' lights are bright, the world celebrates together. UKPOMdkNKW.
Name Encryption#
From @qvKEAyHnx6
A very creative encryption, using the code as a name, which neither allows scripts to snatch it up instantly nor is too difficult to decrypt.
Game Encryption#
From @alphardex
This is even more heavyweight, directly creating a game: https://mygo-find-app-code-2.netlify.app/
"Actually, my overall process is like this: play the game — use SL to pass (or get lucky and pass directly) — get hints — appreciate CG for another hint — OCR (you can also search yourself) — Google Translate (or search directly) — decrypt."
Personal Website/Blog Decryption#
Many big names hide invitation codes in their blog articles and then leave a sentence at the end, "There is an invitation code hidden in the article, can you find it?"
ps. Follow is about to enter public testing; do not leave comments under the blog asking for invitation codes, as this may trouble the blogger.
Quiet Forest - From Innei#
Moment - Quiet Forest (innei.in)
I subscribed to the personal website of the big shot innei using Follow, and while reading the article, I saw the author say in the comments, "There are three Follow invitation codes hidden in the article," so I opened the console to start decrypting.
Searching for follow led to this segment of ciphertext:
\u003c!-- eYb5bKTV3K, ZmSPCbUcTo --\u003e\u003cdiv hidden\u003e-.-- ..--- -... .. --- --- .---- -..- -.. -..- --..-- .---- ....- ..... --..-- -....- ...--\u003c/div\u003e
Where \u003c
represents <
, and \u003e
represents >
(Unicode encoding). By replacing the encoded characters with <>
, we get:
<!-- eYb5bKTV3K, ZmSPCbUcTo --><div hidden>-.-- ..--- -... .. --- --- .---- -..- -.. -..- --..-- .---- ....- ..... --..-- -....- ...--</div>
- The first half
<!-- eYb5bKTV3K, ZmSPCbUcTo -->
is an HTML comment containing two invitation codes. - The second half is Morse code, where
<div hidden>
is a div with the hidden attribute, which will be hidden on the page. Decoding yieldsY2BIOO1XDX,145,-3
, and since the invitation code is unlikely to be all uppercase, the numbers likely represent the positions of lowercase letters, i.e.,y2BioO1XDX
.-3
likely represents an offset (Caesar cipher), leading to the invitation codeb2ElrR1AGA
.
Looking through previous articles, I found that other Follow invitation codes were also hidden.
React i18n CSR Best Practices - Quiet Forest (innei.in)
(By the way, this article hides a Follow invitation code; can you find it?)
Since the big shot innei seems to like hiding invitation codes in the page and then hiding them, this time we directly copied the entire page's HTML and used regex matching.
(?<=\s)[A-Za-z0-9]{10}(?=\s)
It can be seen that the hiding method is also using an HTML comment <!-- 1rsMVNWDIt -->
.
Discussing the Design Philosophy in Follow - Quiet Forest (innei.in)
(This article hides two Follow invitation codes; can you find them?)
The title has been updated to include 4 hidden invitation codes; come find me!
Knowing the pattern, this time we directly matched -->
.
Interestingly, this method only found one, and the remaining invitation codes were elusive. Later, I found comments saying how to decrypt each invitation code, and based on their hints, I searched but still found nothing. It seems I arrived late this time, and the content related to the invitation codes had already been deleted by the author.
- Searching for "If you can see this, you are not far from success. Follow" yielded no matches.
- Searching for ciphertext 1
Caesar=3: trfdNUvNTu
yielded no matches. - The images in the scroll bar: The images in the scroll bar can no longer be found.
- I did not see the
alert()
popup.
Timochan's Blog#
https://www.timochan.cn/notes/44# 总结
When the article was published, I happened to be reading an article in Follow, and noticed at the end it said there was an invitation code hidden in the article:
There is a Follow invitation code in the article? Do you know where it is?
https://www.timochan.cn/api/objects/file/8r806hgw1r2acpofp7.png
At the end of the article, a blurred image URL was framed with strikethrough and filter: blur(8px)
. When I first saw it, I opened it and found it was a QR code. Scanning it redirected back to the blog, so I interpreted it as a reminder to automatically generate content that includes the original link, which led me to overlook such an obvious hiding method. After thoroughly searching the entire text and checking the entire webpage for hidden content, I ultimately locked back onto this QR code. I didn't see the destination address when scanning with WeChat, so I searched for a QR code decoding tool, and it indeed decoded to a string of ciphertext:
https://www.timochan.cn?follow_key=VTJGc2RHVmtYMThvQkpBYmVJaEFxakptUWNBRmxHa0Jta0Jad0QvUHMrND0=
Now that the ciphertext is known, I directly asked GPT if it could identify the encryption method used.
GPT told us that this is data encoded using Base64, and after successfully decoding, I verified that the result provided by GPT was correct. GPT indicated that the new ciphertext's prefix indicates that this is ciphertext generated using the OpenSSL encryption standard (such as AES), so I asked it to continue decoding using AES, with the key being 8 digits, guessing it might be the author's name timochan, but the decryption failed. Later, the author hinted that the key is in the text, consisting of 8 digits. Looking at the date at the top of the article, 20241006 happens to be eight digits, so I provided it to GPT for decryption.
The result obtained is M8g1GosNyw
. Since I had already activated it, I was unsure if this was the correct answer.
Sakana's Blog#
Random Publication R#018 Writing Weekly by the Shore of Enoshima (sakanano.moe)
The ciphertext is hidden in the text.
This week, Follow is still not in public testing, and there is an invitation code hidden here.
yxux oa dz ozrojdjosz ksfx isu jyx isnnsp dtt: cdzsp1ndx9.
pyxz csl axx jyoa gxaadvx, oj yda zsj bxxz xzksfxf oz dzc atxkoiok pdc; oj yda aogtnc lzfxuvszx udzfsg kdax apdttozv dgszv jyx nspxukdax nxjjxua.
csl gdc lax d iuxelxzkc dzdncaoa jssn nowx elotelot js kudkw oj(dnjyslvy alky jssna jctokdnnc fsz'j kszaofxu kdax axzaojorojc, as o ponn fouxkjnc jxnn csl jydj jyx 2zf, 3uf, 5jy, dzf 7jy kydudkjxua si jyx ksfx dux lttxukdax).
dijxu fxkotyxuozv dzf laozv jyx ozrojdjosz ksfx, tnxdax dzzslzkx oj oz jyx foaksuf vuslt.
Analyzing the ciphertext:
- The end of the first line has a format consistent with the invitation code, and there is a colon
:
before it, indicating that this is the encrypted invitation code. - Each line of ciphertext ends with a period
.
, indicating that this is a segment of encrypted text. Since the number of letters remains unchanged, it can only be a substitution encryption or a Caesar cipher.
My thought process is simple; I directly searched the text for content formatted like follow
, which is a string of length 6 with the 2nd/5th and 3rd/4th characters matching. You will find that only the first line's isnnsp
fits, indicating it is likely the encrypted follow
. Now I need to determine whether it is Caesar encryption (letter offset) or random substitution encryption.
- f -> i: 9 -> 6
- s -> o: 18 -> 15
- n -> l: 14 -> 12
- p -> w: 16 -> 23
Some shifted by 3, some by 2, and some by 7, so I ruled out Caesar encryption and treated it as random substitution encryption. I began to create a codebook. At this point, the known substitutions were too few, so I needed some luck to guess what the original text of the first line was.
Noticing the sentence above the ciphertext, "This week Follow is still not in public testing, and there is an invitation code hidden here," I boldly guessed that the first few words of the ciphertext represent here is an invitation code for ??? follow a??: ...
, which seems reasonable, and the character count matches. There are no violations of the substitution rules among the same letters, so I confirmed that this is the encryption method. I then guessed the two missing words in the first line to be the
and app
, completing the first line as here is an invitation code for the follow app: ...
At this point, our decryption codebook looks like this: From the encrypted content, To the original letter, for example, replacing a with s, replacing i with f.
From | To | From | To | From | To | From | To |
---|---|---|---|---|---|---|---|
a | s | b | c | d | a | ||
e | f | d | g | h | |||
i | f | j | t | k | c | l | |
m | n | l | o | i | p | w | |
q | r | v | s | o | t | p | |
u | r | v | w | x | e | ||
y | h | z | n |
Manually converting each character is too slow, so I wrote a Python script to use the existing codebook to convert the remaining four sentences.
dict = {"a": "s","b": "_","c": "_","d": "a","e": "_","f": "d","g": "_","h": "_","i": "f","j": "t","k": "c","l": "_","m": "_","n": "l","o": "i","p": "w","q": "_","r": "v","s": "o","t": "p","u": "r","v": "_","w": "_","x": "e","y": "h","z": "n","1": "1","2": "2","3": "3","4": "4","5": "5","6": "6","7": "7","8": "8","9": "9","0": "0",":": ":","." : ".","," : ",","'": "'",";": ";","(": "(",")": ")"," ": " ",}
secret_text = [
"yxux oa dz ozrojdjosz ksfx isu jyx isnnsp dtt: cdzsp1ndx9.",
"pyxz csl axx jyoa gxaadvx, oj yda zsj bxxz xzksfxf oz dzc atxkoiok pdc; oj yda aogtnc lzfxuvszx udzfsg kdax apdttozv dgszv jyx nspxukdax nxjjxua.",
"csl gdc lax d iuxelxzkc dzdncaoa jssn nowx elotelot js kudkw oj(dnjyslvy alky jssna jctokdnnc fsz'j kszaofxu kdax axzaojorojc, as o ponn fouxkjnc jxnn csl jydj jyx 2zf, 3uf, 5jy, dzf 7jy kydudkjxua si jyx ksfx dux lttxukdax).",
"dijxu fxkotyxuozv dzf laozv jyx ozrojdjosz ksfx, tnxdax dzzslzkx oj oz jyx foaksuf vuslt."]
for txt in secret_text:
print(*[dict.get(i, "?") for i in txt], sep="")
# here is an invitation code for the follow app: ?anow1lae9.
# when _o_ see this _essa_e, it has not _een encoded in an_ specific wa_; it has si_pl_ _nder_one rando_ case swappin_ a_on_ the lowercase letters.
# _o_ _a_ _se a fre__enc_ anal_sis tool li_e __ip__ip to crac_ it(altho__h s_ch tools t_picall_ don't consider case sensitivit_, so i will directl_ tell _o_ that the 2nd, 3rd, 5th, and 7th characters of the code are _ppercase).
# after decipherin_ and _sin_ the invitation code_ please anno_nce it in the discord _ro_p.
At this point, the second sentence is easy to guess: when you see this message, it has not been encoded in any specific way; it has simply undergone random case swapping among the lowercase letters.
Continuing to decrypt the remaining codebook yields:
From | To | From | To | From | To | From | To |
---|---|---|---|---|---|---|---|
a | s | b | b | c | y | d | a |
e | q | f | d | g | m | h | 未出现 |
i | f | j | t | k | c | l | u |
m | 未出现 | n | l | o | i | p | w |
q | 未出现 | r | v | s | o | t | p |
u | r | v | g | w | k | x | e |
y | h | z | n |
Finally, the ciphertext was converted into plaintext:
Here is an invitation code for the follow app: yanow1lae9.
When you see this message, it has not been encoded in any specific way; It has simply undergone random case swapping among the lowercase letters.
You may use a frequency analysis tool like quipquip to crack it (although such tools typically don't consider case sensitivity, so i will directly tell you that the 2nd, 3rd, 5th, and 7th characters of the code are uppercase).
After deciphering and using the invitation code, please announce it in the discord group.
From the third line, it can be inferred that the 2nd, 3rd, 5th, and 7th letters are uppercase, thus the invitation code is yANoW1Lae9
.