QSL卡的數位簽名
- 前言
近年來,越來越多的電台不再發送紙質的 QSL 卡片,轉而使用電子版的 QSL 卡片或使用線上日誌服務。我們意識到,線上日誌服務過於依賴某些中心化的網站,且無法充分展現電台的個人特色,因此無法完全取代紙質 QSL 卡片。
同時,沒有簽名電子版的 QSL 卡片極易被偽造,無法單獨證明通訊的真實性。 本文提出了一種可行的數位簽章方案,在不影響電子 QSL 卡片功能、個人化 QSL 卡片的前提下,對 QSL 卡片上的資訊進行數位簽章。
- 範圍
本文定義一種用於對數位 QSL 卡片進行數位簽名的方法。但本文並未對公開金鑰的發放、信任以及撤銷流程提出要求。
- 需求
本文提出的數位簽名,符合以下要求:
i. 數位簽名可以方便地辨識、驗證,並且不需要依賴中央化的第三方服務。
ii. 數位簽名對 QSL 卡片的設計和美觀性產生顯著影響。
iii. 接收方對收到之 QSL 卡片進行格式轉換等操作,不會影響簽名效力。
四。接收方可以印製包含數字簽名的 QSL 卡,印製後的卡片可獨立驗證。
- 規範性參考文件
GB/T 1.1-2020 標準化工作規範,第一部分:標準化文件的結構與編寫規則。
本文中的粗體「(不)應該”、“(不)建議”、“可以、不需要”、“(無法)”、“(不可能)「使用」符合《GB/T 1.1-2020 標準化工作規範 第一部分:標準化文件的結構與起草規則》附錄 C 的定義。
- 定義
5.1 基本定義
- 位 由 8 位二進制組成的符號
- 簽名載荷 在實際簽署過的數據中,有意義的部分。
- 簽署過的數據 數字簽名演算法的輸入
- 簽名 由文件標頭、簽名演算法描述以及數位簽章等部分組成的檔案。
5.2 SSH 訊息
本文多次描述 SSH 訊息結構體,在本文的語義範圍內,所使用的類型包括:
ssh-string 以四個字、大端序表示的字串長度和先前指定之字串,字串中可包含 Unicode NUL 字元,但字串不得包含過多的 Unicode NUL 字元。
uint32 四個字、大端序表示的 32 位無號整數。
字節 [N] N 個位元組,沒有其他資訊
varint 變長數字,其最高位表示該數字是否為最後一位(1 表示否,0 表示是)。例如,150 表示…10010110 00000001,將十六進位數字轉換為96 01。 請注意:此類型並非 SSH 訊息定義。
具體實作
6.1. 數位簽名演算法選擇
在這個設計中,我們將使用 SSH 鍵對 QSL 卡片上的資訊進行數位簽名。這是因為 SSH 的簽名訊息相較於 PGP 簽名的訊息更小,也更容易在 QSL 卡片上顯示。
至於具體的演算法選擇,我們使用了 Ed25519 橢圓曲線密碼。這是因為 Ed25519 的公開鍵大小和簽名大小都足夠小,可以更容易地嵌入在 QSL 卡片中。
簽署內容並未包含被簽署的資訊。
6.2 數位簽名中的 ADIF 載荷
數字簽名的有效載荷為一個 ADIF 文件,其內容可以從 QSL 卡片上呈現的資訊中唯一構成。
6.2.1 建立 ADIF 結構
使用數位簽名所產生的資訊,採用 ADIF 格式。由於 ADIF 格式具有易於閱讀的特性,因此可以簡單地建立,而且因為數位簽名不包含被簽署的資訊,所以被簽署資訊的長度不會影響簽名的長度。
以下資訊會依照順序包含於 ADIF 數據中:
- QSO_DATE
- TIME_ON
- BAND
- CALL
- MODE
- STATION_CALLSIGN
- OPERATOR
其中, QSO_DATE用於表示 8 位數字(年、月、日)的協調時間 (UTC) 日期, TIME_ON對於以 6 位數字 (時、分、秒) 表示的協調時間 (UTC),無論 QSL 卡片上是否印有通訊的秒數,時間都應…切斷直到整分鐘(即將秒數簡單設定為 0)。
以上各項皆應使用大寫字母。如果 QSL 卡片上沒有說明操作員,則…OPERATOR不包含任何修飾STATION_CALLSIGN.
例如,以下這張 QSL 卡:
致 BB0BBB / DE B4/BG6TOE
日期 時間 (BJT) /頻率 /模式 / RST
2023-01-01 02:00:59 14.245 MHz USB 59 59
[ ]PSE [ ]TNX QSL
VY TU! 73
將其轉換為 ADIF 格式:
<QSO\_日期:8>20221231<持續時間:6>180000<頻段:3>20M<撥號:6>BB0BBB<模式:3>USB<站台呼號:9>B4/BG6TOE<操作員:6>BG6TOE<EOR>
這份文件xxd輸出至:
00000000: 3c51 534f 5f44 4154 453a 383e 3230 3232 <QSO\_日期:8>2022
00000010: 3132 3331 3c54 494d 455f 4f4e 3a36 3e31 1231<持續時間:6>1
00000020: 3830 3030 303c 4241 4e44 3a33 3e32 304d 80000<頻段:3>20M
00000030: 3c43 414c 4c3a 363e 4242 3042 4242 3c4d <撥號:6>BB0BBB<M
00000040: 4f44 453a 333e 5553 423c 5354 4154 494f ODE:3>USB<STATIO
00000050: 4e5f 4341 4c4c 5349 474e 3a39 3e42 342f N_CALLSIGN:9>B4/
00000060: 4247 3654 4f45 3c4f 5045 5241 544f 523a BG6TOE<操作員:
00000070: 363e 4247 3654 4f45 3c45 4f52 3e 6>BG6TOE<EOR>
請注意:文章結尾不該若有任何多餘的字元(包含換行、空格、制表符等),則:<EOR>後方沒有任何字元。
6.2.2 建立包含多個 QSO 的 ADIF 資訊
如果一張 QSL 卡片上包含多個 QSO,則對應的 ADIF 檔案。應依照通聯的時間順序,直接將各個 QSO 的 ADIF 數據串聯,在文章結尾。不該若有任何多餘字元(包含換行、空格、制表符等),即,以最後一個 QSO<EOR>後方沒有任何字元。
6.3 簽名資料
6.3.1 呈現方式
簽名資料可以以 Base64 編碼後直接顯示於 QSL 卡片上的簽名資料。宜採用等寬字體排版。使用的字體應能夠區分i、l、1, O、o、0, 5、S等待 Base64 使用的編碼字元。
簽名資料可以以 Base32 編碼後直接顯示於 QSL 卡片上的簽名數據。宜採用等寬字體的排版。
簽名資料宜已編碼為 Base45 後,並包含於 QR Code 中。 此時的簽名資料。應為獨立的二維碼。這個二維碼可以使用除了黑色、白色以外的其他顏色,但…應將淺色區域作為二維碼的背景,深色則作為二維碼的前景色。
為了確保產生二維碼辨識的成功率,請使用 QR Code 作為簽名資料的載體。不適合使用除了 Base45 之外的其他編碼。
6.3.2 二進位簽名資料格式
二進位簽名用於 SSH 簽名結構,其格式如下:
byte\[6] MAGIC\_PREAMBLE
uint32 SIG\_VERSION
ssh-string publickey
ssh-string namespace
ssh-string reserved
ssh-string hash\_algorithm
ssh-string signature
其中:MAGIC_PREAMBLE為了SSHSIG, SIG_VERSION為 1.
publickey用於序列化的簽名金鑰的公開鍵。
namespace應為了adif-qslv1.
reserved應為空。
hash_algorithm應為了sha512(也就是,總是使用 SHA512 進行對資料的簽名)。
signature用於 SSH 正文的簽名,請使用。ssh-ed25519演算法。
6.3.3 簽名的簡化
為了讓簽名內容更易於顯示,可以對簽名內容進行簡化。簡化後的簽名僅包含頭部及 ED25519 簽名數據。其中,頭部固定為:DQSLV1,緊接著 64 位的 ED25519 簽名X 或 Y。當接收方收到以「」開頭的訊息時,DQSLV1在取得簽名資料時,應將其展開為標準簽名格式進行驗證。
6.3.4 簽署過的內容
實際簽署的內容為:
`byte[6]` MAGIC\_PREAMBLE
`ssh-string` namespace
`ssh-string` reserved
`ssh-string` hash\_algorithm
`ssh-string` H(message)
其中:MAGIC_PREAMBLE為了SSHSIG, SIG_VERSION為 1.
publickey應用於序列化的簽名金鑰的公開鍵。namespace應為了adif-qslv1.
reserved應為空。
hash_algorithm應為了sha512(也就是,總是使用 SHA512 進行資料的簽名)。
message4.2 節中所述的 ADIF 檔案, H(訊息)針對其 SHA-512 演算法產生的指紋。
將此內容經過 SSH Message 格式編碼後,使用 Ed25519 的私鑰和…ssh-ed25519完成簽名,即獲得第4.3.1節中signature欄位。
- 額外提供原始 QSO數據
簽名前可附加原始 QSO 資料,以便機器直接辨識和驗證。原始 QSO 資料為簡化的極小 QSO 元資料,包含以下欄位:通訊時間、通訊頻段、通訊模式、接收方呼號、發送方呼號、OP。
其格式如下:
`byte[6]` MAGIC_PREAMBLE
變數:呼叫號碼 (call)
變數:站台呼叫號碼 (station_callsign)
變數:操作員
SSH 格式的資料
其中,「call」、「station\_callsign」和「operator」分別為呼號的三十六位數表示(見下表):
+---------++----+----++----+----+
|字|號碼||字|號碼||字|號碼 |
+---------++----+----++----+----+
| 0 | 0 || C | 12 || O | 24 |
| 1 | 1 || D | 13 || P | 25 |
| 2 | 2 || E | 14 || Q | 26 |
| 3 | 3 || F | 15 || R | 27 |
| 4 | 4 || G | 16 || S | 28 |
| 5 | 5 || H | 17 || T | 29 |
| 6 | 6 || I | 18 || U | 30 |
| 7 | 7 || J | 19 || V | 31 |
| 8 | 8 || K | 20 || W | 32 |
| 9 | 9 || L | 21 || X | 33 |
| A | 10 || M | 22 || Y | 34 |
| B | 11 || N | 23 || Z | 35 |
| / | 36 |+----+----++----+----+
例如B1CRA表示為11 * 37^4 + 1 * 37^3 + 12 * 37^2 + 27 * 37 + 10 = 20683861
其中,「data」是由多個最小的 QSO 組合而成的字串,其格式如下:
varint 通訊記錄的時間戳記
varint 頻段
字節\[8] 模式
其中 QSO 時間戳為協定時間自 1970 年 1 月 1 日起的秒數(但精確到分鐘)。頻帶為對應頻段的低端(千赫茲)數字,例如 20 米頻段表示為 14000。模式為表示模式的字串,若不足 8 個字。\0補充。
- 範例
假設 ST4TION 使用無線電 C3SHI 與 TE5T 在北京時間 2023 年 1 月 1 日 10:05:30,在 20 米頻段上使用 MFSK modulation 成功進行了一次通訊。目前…ST4TION想要以自己的姓名簽署以下 QSL 卡:
致 TE5T,DE C3SHI 站
日期 時間 (BJT) /頻率 /模式 / RST
2023-01-01 10:00 14.074 MHz MFSK 59 59
[ ]PSE [X]TNX QSL
祝您順利! 73
ST4TION私鑰為:
-----BEGIN OPENSSH 私鑰-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW
QyNTUxOQAAACADTnJZ6blw4CsqVoxzv9iWVVl0ycM8Neqb9QvTyvKqCAAAAJiuWf0orln9
KAAAAAtzc2gtZWQyNTUxOQAAACADTnJZ6blw4CsqVoxzv9iWVVl0ycM8Neqb9QvTyvKqCA
AAAEDgyhqzLTK6rmVqjfvHpvHPYJzdeVuDhRo93XO98jDl1QNOclnpuXDgKypWjHO/2JZV
WXTJwzw16pv1C9PK8qoIAAAAFW1hdHN1QEJHNlRPRS1Ob3RlYm9vaw==
-----END OPENSSH 私鑰-----
其公開金鑰為:
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIANOclnpuXDgKypWjHO/2JZVWXTJwzw16pv1C9PK8qoI
因此,其 ADIF 數據格式如下(包含有效的簽名):
<QSO\_日期:8>20230101<持續時間:6>020500<頻段:3>20M<撥號:4>TE5T<模式:4>MFSK<站台呼號:5>C3SHI<操作員:7>ST4TION<EOR>
請注意:
- 「卡」面上標示的北京時間應轉換為協定世界時。
- 產生的 ADIF 檔案中的「秒」資訊,會被無條件地截斷至 0。
- 從 14.074 測得,為 20M
- RST 並未包含在 ADIF 中
這個 ADIF 的SHA512指紋為:
5d10 5c01 843a 14ad 9852 5f40 f9e9 36d5
0e00 56b0 d98b a04f 6d1d d337 efb8 11bb
f397 52d3 6233 6b64 ab8f 430f cf6b e95d
bfb4 39b9 26c8 fb39 9cbf 414a b386 a1b4
按照以下方式建立簽署過的數據:
00000000: 5353 4853 4947 0000 000a 6164 6966 2d71 SSHSIG....adif-q
00000010: 736c 7631 0000 0000 0000 0006 7368 6135 slv1........sha5
00000020: 3132 0000 0040 5d10 5c01 843a 14ad 9852 @...].\..:...R
00000030: 5f40 f9e9 36d5 0e00 56b0 d98b a04f 6d1d _@..6...V....Om.
00000040: d337 efb8 11bb f397 52d3 6233 6b64 ab8f .7......R.b3kd..
00000050: 430f cf6b e95d bfb4 39b9 26c8 fb39 9cbf C..k.]..9.&...9...
00000060: 414a b386 a1b4 AJ....
使用上述私鑰ssh-ed25519使用簽名方式進行簽名:
00000000: 0000 0053 0000 000b 7373 682d 6564 3235 ...S....ssh-ed25
00000010: 3531 3900 0000 4082 84f9 edcb 8ef8 6cdf 519...@.......l.
00000020: 5bee c347 6762 84ea ce4b 4644 6429 6900 [..Ggb...KFDd)i.
00000030: 4139 6e79 9bbd f74c 2b94 0e53 541e 4dfa A9ny...L+..ST.M.
00000040: 94db 704a 9b77 aad1 4dcd 2e5d 6b3f 30c6 ..pJ.w..M..]k?0.
00000050: 44c6 7e84 ca4d 07 D.~..M.
建構簽名:
00000000: 53 53 48 53 49 47 00 00 01 00 00 03 33 00 00 SSHSIG.......3..
00000010: 0b 73 73 68 2d 65 64 32 35 35 31 39 00 00 00 ..ssh-ed25519...
00000020: 20 03 4e 72 59 e9 b9 70 e0 2b 2a 56 8c 73 .NrY..p.+*V.s..
00000030: 96 55 59 74 c9 c3 3c 35 ea 9b f5 0b d3 ca .UYt..<5........
00000040: 0800 0000 0a61 6469 662d 7173 6c76 3100 .....adif-qslv1.
00000050: 0000 0000 0000 0673 6861 3531 3200 0000 .......sha512...
00000060: 5300 0000 0b73 7368 2d65 6432 3535 3139 S....ssh-ed25519
00000070: 0000 0040 8284 f9ed cb8e f86c df5b eec3 ...@.......l.[..
00000080: 4767 6284 eace 4b46 4464 2969 0041 396e Ggb...KFDd)i.A9n
00000090: 799b bdf7 4c2b 940e 5354 1e4d fa94 db70 y...L+..ST.M...p
000000a0: 4a9b 77aa d14d cd2e 5d6b 3f30 c644 c67e J.w..M..]k?0.D.~
000000b0: 84ca 4d07 ..M.
簡潔簽名:
00000000: 4451 534c 5631 8284 f9ed cb8e f86c df5b DQSLV1.......l.[
00000010: eec3 4767 6284 eace 4b46 4464 2969 0041 ..Ggb...KFDd)i.A
00000020: 396e 799b bdf7 4c2b 940e 5354 1e4d fa94 9ny...L+..ST.M..
00000030: db70 4a9b 77aa d14d cd2e 5d6b 3f30 c644 .pJ.w..M..]k?0.D
00000040: c67e 84ca 4d07 .~..M.
簽署後的 Base64 編碼:
U1NIU0lHAAAAAQAAADMAAAALc3NoLWVkMjU1MTkAAAAgA05yWem5cOArKlaMc7/YllVZdMnDPDXq
m/UL08ryqggAAAAKYWRpZi1xc2x2MQAAAAAAAAAGc2hhNTEyAAAAUwAAAAtzc2gtZWQyNTUxOQAA
AECChPnty474bN9b7sNHZ2KE6s5LRkRkKWkAQTlueZu990wrlA5TVB5N+pTbcEqbd6rRTc0uXWs/
MMZExn6Eyk0H
簡化的簽名 Base64 編碼:
RFFTTFYxgoT57cuO+GzfW+7DR2dihOrOS0ZEZClpAEE5bnmbvfdMK5QOU1QeTfqU23BKm3eq0U3N
Ll1rPzDGRMZ+hMpNBw==
簽署後的 Base45 編碼:
1OAK69*B9000100000610000B00ZQET7D CSF6RW6C97000524C-9MGB.JNCFS%F50YHHBOA0J+DB MPNR7TTT1:U%YQMUUN010002E1AVCC-CIFE1WDY86000000000V 0 8DRW6KE60008MA0006K1OQEBX50UCVW61A6000J10MMG QV0XPBIVTASD8U919KKCZUTAN93T8QA5K10WB7 GFV0OES9CWI2OAH$3NUVGXRJJ9Y5FVKQB.PK BL:7-2P94PJZG9X9
簡化的 Base45 編碼:
TS8*NAF+AMMG QV0XPBIVTASD8U919KKCZUTAN93T8QA5K10WB7 GFV0OES9CWI2OAH$3NUVGXRJJ9Y5FVKQB.PK BL:7-2P94PJZG9X9
- 資訊性參考文件
RFC4634 美國安全哈希演算法(SHA 和 HMAC-SHA)
RFC4648 Base16、Base32 和 Base64 的資料編碼
RFC8709 用於安全外殼 (SSH) 協定的 Ed25519 和 Ed448 公鑰演算法
RFC9285 Base45 資料編碼)
ADIF 非專業數據交換格式(ADIF)規範