天天看點

使用VIM将一行X509證書分解為多行的方式

引:

數字證書有多種格式,對于經過base64編碼的證書而言,如果你将所有内容合并成一行,微軟作業系統還是能正确解析的,然而如果你使用OpenSSL的x509指令解析,就會報錯,可見,微軟的相容行太強了,特别是對自己的東西。

     今日工作中遇到合為一行的數字證書,在windows下可以被認出,然而在Linux下卻不行,于是需要将一行的證書分解為64個字元一行的證書,然後加上-----BEGIN CERTIFICATE-----和-----END CERTIFICATE-----,本文解析兩種方式,完成将一行證書變為N行base64編碼證書的方式,兩種方式均使用vim。

零.初始資料:

MIICBzCCAa8CCqwerC6hedfrvjAJBgabcdjOPQQBMIGKMQswCQYDVQQGEwJDTjELMAkGA1UECBMCU0gxETAPBgNVBAcTCFNoYW5na5678RYwFAYDVQQKEw1Lb2FsIFNvZnR3YXJlMRIwEAzGFpMLEwlTU0wgR1qazXAxDzANBgsdfgMTBmVjYy1jYTEeMBwGCSqGSIb3DQEJARYPZWNjLWNhQGtvYWwuY29tMB4XDTExMDExODsdfgUxM1oXDTExMDIxNzA0NDUxM1owgY4xCzAJBgNVBAYTAkNOMQswCQY2323IEwJTSDERMA8GA1UEBxMIU2hhbmdoYWkxFjAUBgNVBAoTDUtvYWwgU29mdHdhcmUxEuiopgNVBAsTCVNTTCBHcm91cDERMA8GA1UEAxMIZWNjLXVzZXIxIDAeBgkqhkiG9w0BCQEWEWV12341c2VyQGtvYWwuY29tMFkwEwYHKoZIzj0CAQYIKoEcgUUBgi0DQgAEl1iWcIeqYpigXDziJ4GS9M+23bE8qemaJvjpBOEXveF0eMJUN2udNJzHW/WpvTZrJC/mZsXnY+gdkAQIrXWjAJBgcqhkjOPQQBA0cAMEQCIGiWpXNEp4aKT2GzACBUvs0tZQLTanULKX/vTHZCv4FAiAb2s9u4G2SxgiEpWzhdMIuM3WsgbrazxsxSfLLG1234567

以上是初始資料,以一整行的方式儲存了整個數字證書(以經過本人改寫,畢竟證書不能随意暴露...),需要将之整理成每64個字元一行的base64編碼方式,也就是OpenSSL的pem格式證書(去除頭尾)。

一.動态的方式

所謂動态的方式就是用“人的操作方式”進行換行符号的插入,無非就是64個字元作為間隔向前推進,然後插入回車符,是以可以使用如下步驟:

1.定位到64個字元處:

64l

2.進入插入模式:

i

3.拍入回車:

Enter

4.退出插入模式

Esc

5.重複1-4,重複N次,視檔案大小而定

從以上步驟,我們發現,人為的操作其實是一系列确定而且重複的操作,是以我們希望使用諸如宏的方式來完成這個任務,vim擁有宏錄制的功能,指令模式下輸入qX就可以錄制名為X的宏,是以我們隻需要以下步驟就可以完成一個一整行證書的base64編碼:

<q>b        #q開始錄制名字是b的宏

64<l>        #光标右移64個字元

<i>        #進入插入模式

<Enter>        #插入換行

<Esc>        #退出插入模式

<q>        #結束錄制宏b

num<@><b>    #将宏b執行num次,視檔案行大小而定

6.效果:和靜态方式一樣,見靜态方式。

動态的方式肯定能完成這個任務,然而還有靜态的方式

二.靜态的方式

靜态方式是計算機使用的方式,計算機使用程式完成這個任務,雖然計算機程式最終也是人編寫的。計算機程式完成64間隔字元換行的方式使用一種算法,這種算法明顯不符合人的思維方式。正如人類會使用等差數列求和公式計算等差數列和然而計算機必須使用遞推或者遞歸方式一樣,計算機程式沒有歸納的能力,不會使用公式,隻能按步驟進行。

1.在一個新視窗打開help手冊

:help

2.打開change.txt這個help頁

:help change

...

3.找到了替換文法

:[range]s[ubstitute]/{pattern}/{string}/[&][c][e][g][p][r][i][I] [count]

                        For each line in [range] replace a match of {pattern}

                        with {string}.

                        For the {pattern} see |pattern|.

                        {string} can be a literal string, or something

                        special; see |sub-replace-special|.

            ...

顯然在特定位置插入換行是一個“特殊”的需求

4.打開sub-replace-special

:help sub-replace-special

5.找到了以下的解釋

magic   nomagic   action

      \0          replaced with the whole matched pattern          *\0* *s/\0*

在s/orig/string/g中,orig是一個位置,該位置隻能由正規表達式指定,其正規表達式為:.{64},而string則是一個換行符号,根據上面的解釋,string應該為\0\r

6.退出help

:q

8.開始修改

:s/.\{64\}/\0\r/g

9.效果

MIICBzCCAa8CCqwerC6hedfrvjAJBgabcdjOPQQBMIGKMQswCQYDVQQGEwJDTjEL

MAkGA1UECBMCU0gxETAPBgNVBAcTCFNoYW5na5678RYwFAYDVQQKEw1Lb2FsIFNv

ZnR3YXJlMRIwEAzGFpMLEwlTU0wgR1qazXAxDzANBgsdfgMTBmVjYy1jYTEeMBwG

CSqGSIb3DQEJARYPZWNjLWNhQGtvYWwuY29tMB4XDTExMDExODsdfgUxM1oXDTEx

MDIxNzA0NDUxM1owgY4xCzAJBgNVBAYTAkNOMQswCQY2323IEwJTSDERMA8GA1UE

BxMIU2hhbmdoYWkxFjAUBgNVBAoTDUtvYWwgU29mdHdhcmUxEuiopgNVBAsTCVNT

TCBHcm91cDERMA8GA1UEAxMIZWNjLXVzZXIxIDAeBgkqhkiG9w0BCQEWEWV12341

c2VyQGtvYWwuY29tMFkwEwYHKoZIzj0CAQYIKoEcgUUBgi0DQgAEl1iWcIeqYpig

XDziJ4GS9M+23bE8qemaJvjpBOEXveF0eMJUN2udNJzHW/WpvTZrJCYp/mZsXnY+

gdkAQIrXWjAJBgcqhkjOPQQBA0cAMEQCIGiWpXNEp4aKT2GzACBUvs0tZQLTan/U

LKX/vTHZCv4FAiAb2s9u4G2SxgiEpWzhdMIuM3WsgbrazxsxSfLLG1234567

10.然而!然而

然而為什麼在這個任務中,計算機程式使用了公式(正規表達式),而人類的方式卻使用了按照步驟的方式(錄制宏)呢?...

注釋:上述第9點是動态方式和靜态方式共同的結果。

 本文轉自 dog250 51CTO部落格,原文連結:http://blog.51cto.com/dog250/559426