上选修课的时候,老师讲到了合成生物学,提到了有关DNA编码的技术,于是就讲了J.Craig Venter团队把水印编码进DNA的事情。

下面是我在Google上面搜集到的资料:

Researchers at the J Craig Venter Institute recently unveiled their first self-replicating synthetic bacteria (M. mycoides JCVI-syn1.0) whose DNA was ‘programmed’ base pair by base pair. To verify that they had synthesized a new organism and not assembled the DNA from another natural bacteria, scientists encoded a series of ‘watermarks’ into the genes of M. mycoides JCVI-syn1.0. There are four of these hidden messages: an explanation of the coding system used, a URL address for those who crack the code to go visit, a list of 46 authors and contributors, and a series of famous quotes. The presence of these watermarks verifies that M. mycoides JCVI-syn1.0 truly is synthetic and demonstrates the precision and power of JCVI’s new techniques in synthetic biology.

J Craig Venter研究所的研究人员最近揭开了他们的第一批自我复制的合成细菌(M. mycoides JCVI-syn1.0)的细菌,其DNA被碱基对“编程”为碱基对。为了验证他们合成了一种新生物并且没有从另一种天然细菌中组装DNA,科学家们将一系列“水印”编码到了蕈状支原体JCVI-syn1.0的基因中。这些隐藏的消息中有四种:对使用的编码系统的解释,破解该代码的人员的URL地址,46位作者和贡献者的列表以及一系列著名的名言。这些水印的存在验证了M. mycoides JCVI-syn1.0 真正是合成的,并证明了JCVI合成生物学新技术的精确性和功能。 ————摘自SingularityHub

文中还提到,JCVI在2008年就使用密码子实现了简易的DNA编码。他们用20种密码子(由三个字母组成的组编码氨基酸)表示20个字母,这就使得在少数字母被替换的情况下,可以实现简单的信息编码。下面是几个例子:

后来,JCVI决定制作规模更大、表示能力更强的水印。四个中的每个长度都超过一千个碱基对。另外,新系统不仅只编码20个字母,还包括英语的所有字母和标点符号。这一套编码系统显然是和2008年的那一套不一样的,也是本文要讨论的。同样是使用三个碱基对作为一组来表示字符,但是这一套编码系统不局限于氨基酸,而将所有碱基对的可能性都列入其中,于是就可以表示$4^3=64$种字符。

下面是JCVI编码到蕈状支原体JCVI-syn1.0的基因中的”水印“碱基序列:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
Watermark1:
GTTCGAATATTTCTATAGCTGTACATATTGTAATGCTGATAACTAATACTGTGCGCTTGACTGTGATCCTGATAAATAACTTCTTCTGTAGGGTAGAGTTTTATTTAAGGCTACTCACTGGTTGCAAACCAATGCCGTACATTACTAGCTTGATCCTTGGTCGGTCATTGGGGGATATCTCTTACTAATAGAGCGGCCTATCGCGTATTCTCGCCGGACCCCCCTCTCCCACACCAGCGGTGTAGCATCACCAAGAAAATGAGGGGAACGGATGAGGAACGAGTGGGGGCTCATTGCTGATCATAATGACTGTTTATATACTAATGCCGTCAACTGTTTGCTGTGATACTGTGCTTTCGAGGGCGGGAGATTCGTTTTTGACATACATAAATATCATGACAAAACAGCCGGTCATGACAAAACAGCCGGTCATAATAGATTAGCCGGTGACTGTGAAACTAAAGCTACTAATGCCGTCAATAAATATGATAATAGCAACGGCACTGACTGTGAAACTAAAGCCGGCACTCATAATAGATTAGCCGGAGTCGTATTCATAGCCGGTAGATATCACTATAAGGCCCAGGATCATGATGAACACAGCACCACGTCGTCGTCCGAGTTTTTTTGCTGCGACGTCTATACCACGGAAGCTGATCATAAATAGTTTTTTTGCTGCGGCACTAGAGCCGGACAAGCACACTACGTTTGTAAATACATCGTTCCGAATTGTAAATAATTTAATTTCGTATTTAAATTATATGATCACTGGCTATAGTCTAGTGATAACTACAATAGCTAGCAATAAGTCATATATAACAATAGCTGAACCTGTGCTACATATCCGCTATACGGTAGATATCACTATAAGGCCCAGGACAATAGCTGAACTGACGTCAGCAACTACGTTTAGCTTGACTGTGGTCGGTTTTTTTGCTGCGACGTCTATACGGAAGCTCATAACTATAAGAGCGGCACTAGAGCCGGCACACAAGCCGGCACAGTCGTATTCATAGCCGGCACTCATGACAAAACAGC

Watermark2:
CAACTGGCAGCATAAAACATATAGAACTACCTGCTATAAGTGATACAACTGTTTTCATAGTAAAACATACAACGTTGCTGATAGTACTCCTAAGTGATAGCTTAGTGCGTTTAGCATATATTGTAGGCTTCATAATAAGTGATATTTTAGCTACGTAACTAAATAAACTAGCTATGACTGTACTCCTAAGTGATATTTTCATCCTTTGCAATACAATAACTACTACATCAATAGTGCGTGATATGCCTGTGCTAGATATAGAACACATAACTACGTTTGCTGTTTTCAGTGATATGCTAGTTTCATCTATAGATATAGGCTGCTTAGATTCCCTACTAGCTATTTCTGTAGGTGATATACGTCCATTGCATAAGTTAATGCATTTAACTAGCTGTGATACTATAGCATCCCCATTCCTAGTGCATATTTTCATCCTAGTGCTACGTGATATAATTGTACTAATGCCTGTAGATAATTTAATGCCTGGCTCGTTTGTAGGTGATAATTTAGTGCCTGTAAAACATATACCTGAGTGCTCGTTGCGTGATAGTTCGTTCATGCATATACAACTAGGCTGCTGTGATATGGTCACTGCCCTTACTGTGCTACATATTACTGCGAGGGGGATGACGTATAAACCTGTTGTAAGTGATATGACGTATATAACTACTAGTGATATGACGTATAGGCTAGAACAACGTGATATGACGTATATGACTACTGTCCCAAACATCAGTGATATGACGTATACTATAATTTCTATAATAGTGATAAATAAACCTGGGCTAAATACGTTCCTGAATACGTGGCATAAACCTGGGCTAACGAGGAATACCCATAGTTTAGCAATAAGCTATAGTTCGTCATTTTTAA

Watermark3:
TTTAACCATATTTAAATATCATCCTGATTTTCACTGGCTCGTTGCGTGATATAGATTCTACTGTAGTGCTAGATAGTTCTGTACTAGGTGATACTATAGATTTCATAGATAGCACTACTGGCTTCATGCTAGGCATCCCAATAGCTAGTGATAGTTTAGTGCATACAACGTCATGTGATACAACGTTGCTGGCTGTAGATACAACGTCGTATTCTGTAAGTGATACAATAGCTATTGCTGTGCATAGGCCTATAGTGGCTGTAACTAGTGATATCACGTAACAACCATATAAGTTAGATTTAATGCCCCTGACTGAACGCTCGTTGCGTGATAGTTTAGGCTCGTTGCATACAACTGTGATTTTCATAAAACAACGTGATAATTTAGTGCTAGATAAGTTCCGCTTAGCAAGTGATAGTTTCCGCTTGACTGTGCATAGTTCGTTCATGCGCTCGTTGCGTGATAAACTAGGCAGCTTCACAACTGATAATTTAATTGCTGATATTGCTGGCTGTCTAGTGCTAGTGATCATAGTGCGTGATAGTTTAAGCTGCTCTGTTTTAGATATCACGTGCTTGATAATGAAACTAACTAGTGATACTACGTAGTTAACTATGAATAGGCCTACTGTAAATTCAATAGTGCGTGATATTGAACTAGATTCTGCAACTGCTAATATGCCGTGCTGCACGTTTGGTGATAGTTTAGCATGCTTCACTATAATAAATATGGTAGTTGTAACTACTGCGAATAGGGGGAGCTTAATAAATATGATCACTGTGCTACGCTATATGCCGTTGAATATAGGCTATATGATCATAACATATATAGCTATAAGTGATAAGTTCCTGAATATAGGCTATATGATCATAACATATACAACTGTACTCATGAATAAGTTAACGAGGA

Watermark4:
TTTCATTGCTGATCACTGTAGATATAGTGCATTCTATAAGTCGCTCCCACAGGCTAGTGCTGCGCACGTTTTTCAGTGATATTATCCTAGTGCTACATAACATCATAGTGCGTGATAAACCTGATACAATAGGTGATATCATAGCAACTGAACTGACGTTGCATAGCTCAACTGTGATCAGTGATATAGATTCTGATACTATAGCAACGTTGCGTGATATTTTCACTACTGGCTTGACTGTAGTGCATATGATAGTACGTCTAACTAGCATAACTAGTGATAGTTATATTTCTATAGCTGTACATATTGTAATGCTGATAACTAGTGATATAATCCAACTAGATAGTCCTGAACTGATCCCTATGCTAACTAGTGATAAACTAACTGATACATCGTTCCTGCTACGTGATAGCTTCACTGAGTTCCATACATCGTCGTGCTTAAACATCAGTGATAACACTATAGAGTTCATAGATACTGCATTAACTAGTGATATGACTGCAAATAGCTTGACGTTTTGCAGTCTAAAACAACGTGATAATTCTGTAGTGCTAGATACTATAGATTTCCTGCTAAGTGATAAGTCTACTGATTTACTAATGAATAGCTTGGTTTTGGCATACACTGTGCGCTGCACTGGTGATAGCTTTTCGTTGATGAATAATTTCCCTAGCACTGTGCGTGATATGCTAGATTCTGTAGATAGGCTAAATTCGTCTACGTTTGTAGGTGATAGTTTAGTTGCTGTAACTAATATTATCCCTGTGCCGTTGCTAAGCTGTGATATCATAGTGCTGCTAGATATGATAAGCAAACTAATAGAGTCGAGGGGGAGTCTCATAGTGAATACTGATATTTTAGTGCTGCCGTTGAATAAGTTCCCTGAACATTGTGATACTGATATTTTAGTGCTGCCGTTGAATATCCTGCATTTAACTAGCTTGATAGTGCATTCGAGGAATACCCATACTACTGTTTTCATAGCTAATTATAGGCTAACATTGCCAATAGTGC

JCVI没有给出这套编码系统的编码方式,但是放出了第四个水印里的几句带有引号的名言,来方便破译:

“TO LIVE, TO ERR, TO FALL, TO TRIUMPH, TO RECREATE LIFE OUT OF LIFE.” - JAMES JOYCE “SEE THINGS NOT AS THEY ARE, BUT AS THEY MIGHT BE.” “WHAT I CANNOT BUILD, I CANNOT UNDERSTAND.” - RICHARD FEYNMAN

在查找到一篇使用Arc语言破译这段碱基编码的文章时,我发现这三句名言并非都在第四段水印中,而是在第二、三、四段水印中各含有一句。于是,在已经知道答案的情况下,我也尝试使用Python对这段碱基进行分析。

首先我使用re.findall()方法,将碱基序列每三个化为一组并加入到一个新列表中,然后使用Counter方法对后三个序列的列表中的元素计数:

1
2
3
4
5
6
7
8
9
>>> import re
>>> from collections import Counter
>>> code1 = "GTTCG ... ACAGC"
>>> code2 = "CAACT ... TTTAA"
>>> code3 = "TTTAA ... GAGGA"
>>> code4 = "TTTCA ... AGTGC"
>>> split = re.findall(r'.{3}', code2+code3+code4)
>>> print(Counter(split))
>>> Counter({'ATA': 127, 'TAG': 87, 'TAA': 65, 'CTG': 64, 'TGC': 64, 'CTA': 49, 'GTG': 49, 'CGT': 42, 'TGA': 41, 'GCT': 39, 'TCA': 35, 'AAC': 31, 'ATT': 25, 'CAA': 24, 'TTT': 24, 'TCC': 22, 'CAT': 19, 'TAC': 18, 'TTG': 14, 'GCA': 13, 'GTT': 13, 'AGT': 12, 'GGC': 9, 'ACA': 7, 'CCC': 7, 'GTC': 7, 'TGG': 6, 'CGA': 6, 'GGA': 6, 'TTA': 4, 'GGG': 3})

可见TGG、CGA、GGA三个碱基对存在6个。所以这三个之中的一个必然代表字符"。接下来可以把名言的字符数量和对应两个碱基对之间的碱基对数量进行比较,从而得出引号代表的碱基对:

首先搜索TGG:

可以看见在第四个水印中,两个TGG碱基对中间仅有一个碱基对,故显然不正确。

接下来搜索CGA和GGA:

可以看见在第二条水印中,都仅搜索到了两个CGA和GGA,且它们之间有一段碱基对。那么把这两段碱基对的长度和第一句名言的字符串长度做一个比较,就可以得出引号对应的碱基对了。

1
2
3
4
5
6
7
8
9
>>> d1 = "GGGGGATGACGTATAAACCTGTTGTAAGTGATATGACGTATATAACTACTAGTGATATGACGTATAGGCTAGAACAACGTGATATGACGTATATGACTACTGTCCCAAACATCAGTGATATGACGTATACTATAATTTCTATAATAGTGATAAATAAACCTGGGCTAAATACGTTCCTGAATACGTGGCATAAACCTGGGCTAA"
>>> len(d1)
204
>>> d2 = "TGACGTATAAACCTGTTGTAAGTGATATGACGTATATAACTACTAGTGATATGACGTATAGGCTAGAACAACGTGATATGACGTATATGACTACTGTCCCAAACATCAGTGATATGACGTATACTATAATTTCTATAATAGTGATAAATAAACCTGGGCTAAATACGTTCCTGAATACGTGGCATAAACCTGGGCTAACGA"
>>> len(d2)
201
>>> quote1 = "TO LIVE, TO ERR, TO FALL, TO TRIUMPH, TO RECREATE LIFE OUT OF LIFE."
>>> len(quote1)*3
201

综上,GGA对应的字符为"

为了严谨,还需要对后面两段名言进行验证,此处篇幅所限不再赘述。

接下来,把碱基对和字符进行对应,就可以破译出部分编码:

由于时间所限,没能破译出所有的编码,有时间再更。

下面是那位使用Arc破译出碱基编码的带佬给出的解码表(由于所给信息有限,部分碱基对无法被破译,用?代替):

碱基对字符碱基对字符碱基对字符碱基对字符
AAA?AACLAAG?AAT3
ACAPACC?ACG?ACT2
AGA4AGC>AGG?AGTB
ATA空格ATC?ATG?ATTD
CAAMCAC/CAG:CATY
CCA=CCC-CCG?CCT?
CGA.CGC8CGG<CGTO
CTARCTC?CTGICTT1
GAA'GAC?GAG!GAT?
GCAKGCC6GCG5GCTS
GGA"GGCFGGG换行符\nGGTX
GTA9GTCWGTG,GTTJ
TAAETACGTAGATAT7
TCAHTCCUTCG@TCT0
TGATTGCNTGGZTGT?
TTAQTTC?TTGVTTTC

基于上表,我用Python写出了一个加解密算法:

 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
import re

code1 = "GTTCG ... ACAGC"
code2 = "CAACT ... TTTAA"
code3 = "TTTAA ... GAGGA"
code4 = "TTTCA ... AGTGC"

decodeDict = {  
        'AAA':'(AAA)', 'ACA':'P'    , 'AGA':'4'    , 'ATA':' '    ,
        'CAA':'M'    , 'CCA':'='    , 'CGA':'.'    , 'CTA':'R'    ,  
        'GAA':"'"    , 'GCA':'K'    , 'GGA':'"'    , 'GTA':'9'    ,
        'TAA':'E'    , 'TCA':'H'    , 'TGA':'T'    , 'TTA':'Q'    ,  
        'AAC':'L'    , 'ACC':'(ACC)', 'AGC':'>'    , 'ATC':'(ATC)',
        'CAC':'/'    , 'CCC':'-'    , 'CGC':'8'    , 'CTC':'(CTC)',  
        'GAC':'(GAC)', 'GCC':'6'    , 'GGC':'F'    , 'GTC':'W'    ,
        'TAC':'G'    , 'TCC':'U'    , 'TGC':'N'    , 'TTC':'(TTC)',  
        'AAG':'(AAG)', 'ACG':'(ACG)', 'AGG':'(AGG)', 'ATG':'(ATG)',
        'CAG':':'    , 'CCG':'(CCG)', 'CGG':'<'    , 'CTG':'I'    ,  
        'GAG':'!'    , 'GCG':'5'    , 'GGG':"\n"   , 'GTG':','    ,
        'TAG':'A'    , 'TCG':'@'    , 'TGG':'Z'    , 'TTG':'V'    ,  
        'AAT':'3'    , 'ACT':'2'    , 'AGT':'B'    , 'ATT':'D'    ,
        'CAT':'Y'    , 'CCT':'(CCT)', 'CGT':'O'    , 'CTT':'1'    ,  
        'GAT':'(GAT)', 'GCT':'S'    , 'GGT':'X'    , 'GTT':'J'    ,
        'TAT':'7'    , 'TCT':'0'    , 'TGT':'(TGT)', 'TTT':'C'
    }


def decode(string):
    strArr = re.findall(r'.{3}', string)
    for each in strArr:
        print(decodeDict[each],end="")
    print()
      
      
def encode(string):
    for each in string:
        for (key, value) in filter(lambda x:each==x[1], decodeDict.items()):
            print(key, end="")
    print()

decode(code1)
decode(code2)
decode(code3)
decode(code4)

解密的结果如下:

J. CRAIG VENTER INSTITUTE 2009 ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789(TTC)@(CCG)(GAC)-(CCT)(CTC)=/:<(TGT)>(ATC)(ACC)(AAG)(AAA)(ATG)(AGG)"(ACG)(GAT)!'., SYNTHETIC GENOMICS, INC. <!DOCTYPE HTML><HTML><HEAD><TITLE>GENOME TEAM</TITLE></HEAD><BODY><A HREF="HTTP://WWW.JCVI.ORG/">THE JCVI</A><P>PROVE YOU'VE DECODED THIS WATERMARK BY EMAILING US <A HREF="MAILTO:MROQSTIZ@JCVI.ORG">HERE!</A></P></BODY></HTML> MIKKEL ALGIRE, MICHAEL MONTAGUE, SANJAY VASHEE, CAROLE LARTIGUE, CHUCK MERRYMAN, NINA ALPEROVICH, NACYRA ASSAD-GARCIA, GWYN BENDERS, RAY-YUAN CHUANG, EVGENIA DENISOVA, DANIEL GIBSON, JOHN GLASS, ZHI-QING QI. "TO LIVE, TO ERR, TO FALL, TO TRIUMPH, TO RECREATE LIFE OUT OF LIFE." - JAMES JOYCE CLYDE HUTCHISON, ADRIANA JIGA, RADHA KRISHNAKUMAR, JAN MOY, MONZIA MOODIE, MARVIN FRAZIER, HOLLY BADEN-TILSON, JASON MITCHELL, DANA BUSAM, JUSTIN JOHNSON, LAKSHMI DEVI VISWANATHAN, JESSICA HOSTETLER, ROBERT FRIEDMAN, VLADIMIR NOSKOV, JAYSHREE ZAVERI. "SEE THINGS NOT AS THEY ARE, BUT AS THEY MIGHT BE." CYNTHIA ANDREWS-PFANNKOCH, QUANG PHAN, LI MA, HAMILTON SMITH, ADI RAMON, CHRISTIAN TAGWERKER, J CRAIG VENTER, EULA WILTURNER, LEI YOUNG, SHIBU YOOSEPH, PRABHA IYER, TIM STOCKWELL, DIANA RADUNE, BRIDGET SZCZYPINSKI, SCOTT DURKIN, NADIA FEDOROVA, JAVIER QUINONES, HANNA TEKLEAB. WHAT I CANNOT BUILD, I CANNOT UNDERSTAND." - RICHARD FEYNMAN

参考资料

  1. Using Arc to decode Venter’s secret DNA watermark
  2. Secret Messages Coded Into DNA Of Venter Synthetic Bacteria
  3. Creation of a Bacterial Cell Controlled by a Chemically Synthesized Genome