發表文章

目前顯示的是 2019的文章

Converting Between Byte Arrays and Hexadecimal Strings in Java

1. Overview In the tutorial, we'll take a look at different ways to convert a byte array to a hexadecimal string, and vice versa. The record is introduced because the result of encryption and decryption will be a byte array, but my data must be passed through the HTTP protocol. 2. Converting Between Byte and Hexadecimal First of all, let's take a look at conversion logic between byte and hexadecimal numbers. 2.1 Byte to Hexadecimal The bytes are 8 bit signed integers in Java. Therefore, we need to convert each 4-bit segment to hex separately and concatenate them. Consequently, we'll get two hexadecimal characters after conversion. For instance, we can write 45 as 0010 1101 in binary, and the hexadecimal equivalent will be "2d": 0010 = 2 (base 10) = 2 (base 16) 1101 = 13 (base 10) = d (base 16) Therefore: 45 = 0010 1101 = 0x2d Let's implement the simple logic in Java: public String byteToHex(byte num) { char[] hexDigits = new char[2]...

Little Endian VS Big Endian

圖片
Endianness, 當一個資料要儲存到記憶體時 有兩種儲存方式, 如上圖其一為 Little Endian, 另一為 Big Endian 通常而言不需要考慮此排列方式的問題, 但是當要將資料傳遞到別的硬體平台上,或是網路上時 這問題就變得需要在意了, 在網路傳輸上使用的是 Big Endian, Kernel 中也有提供 htonl, htons, ntohs, ntohl 等 function 幫助將資料在 Big Endian 及 機器的 Endian 之間作轉換 ~ 目前也有平台是支援多種 Endianness 的 ex: ARM, PowerPC, MIPS … 透過硬體上的一個 Register 來設定要使用那種方式 當拿到一個新的硬體時,要如何得知此硬體目前使用的是哪一種 Endianness 呢? 1. 翻閱 Spec, 一般而言 CPU Spec 上都會標明是哪一種,不過在可以並存的硬體上 就需要別的方式來幫助判斷了。 2. 寫小程式來判別,在此提供兩種程式寫法   2-1 先宣告 integer 0x12345678   再使用一個 char pointer 檢查第一個 byte 存 0x12 or 0x78 #include int main() { int a = 0x12345678; char *ptr = (char *)&a; if (*ptr == 0x12) printf("Big Endian\n"); else printf("Little Endian\n"); return 0; } 2-2 使用 htonl 來幫忙   剛剛有提到 htonl 會將資料轉成 Big Endian,若轉換前後一致那就是 Big endian 啦 #include int main() { int a = 0x12345678; int b = htonl(a); if (b == a) printf("Big Endian\n"); el...

數字證書、公私鑰筆記

格式 X.509 在密碼學中,X.509是由ITU-T爲了公開密鑰基礎建設(PKI)與授權管理基礎建設(PMI)提出的產業標準。X.509標準,規範了公開密鑰認證、證書吊銷列表、授權證書、證書路徑驗證算法等。 兩種編碼格式: PEM  - Privacy Enhanced Mail,打開看文本格式,以"-----BEGIN..."開頭, "-----END..."結尾,內容是BASE64編碼. PEM 編碼(Base64)的後綴是: .PEM .CER .CRT  DER   – 辨別編碼規則(DER)可包含所有私鑰、公鑰和證書。 它是大多數瀏覽器的缺省格式,並按ASN1 DER格式存儲。 它是無報頭的- PEM是用文本報頭包圍的DER( Distinguished Encoding Rules),打開看是二進制格式,不可讀. DER 編碼(ASCII)的後綴是: .DER .CER .CRT   PKCS(Public Key Cryptography Standards) PKCS是由RSA公司制定的一組關於公鑰加密的標準,和存儲相關的主要包括: PKCS#1:定義了RSA的數理基礎、公私鑰格式,以及加解密、簽/驗章的流程 RSA public key (PKCS#1) -----BEGIN RSA PUBLIC KEY----- ... -----END RSA PUBLIC KEY----- RSA public key (PKCS#8) -----BEGIN PUBLIC KEY----- ... -----END PUBLIC KEY----- PKCS5Padding & PKCS7Padding PKCS#5和PKCS#7填充機制之間的差異在於塊大小; PKCS#5填充是為8字節的塊大小定義的,PKCS#7填充將適用於1到255字節的任何塊大小。 PKCS#8:定義了私鑰消息的表示 PKCS#10:證書請求語法標準。PKCS#10定義了證書請求的語法。證書請求包含一個唯一識別名,公鑰和任選的一組屬性,它們一起被請求證書的實體簽名(證書管理協議)中的PKIX證書請求消息就是一個PKCS#10)。 PKCS#12...

[Mac] 修改環境變數下的路徑

列出環境變數 printenv 列出環境變數下的 Path echo $PATH 打開 bash profile vi ~/.bash_profile 新增路徑到 PATH export PATH=$PATH:路徑名稱 存擋 :wq 執行 bash profile source ~/.bash_profile

ln - 建立連結指令

本篇介紹如何使用 Linux 的   ln  指令建立各種連結檔案。 ln 是在 Linux 及其他 Unix Like 作業系統建立連結的指令,概念跟 Windows 的捷徑差不多。ln 建立的連結分為 "硬連結" (hard link) 及 "軟連結" (symbolic link), 預設 ln 會使用 hard link。 建立硬連結 所謂的硬連結就是使用相同 inode 的連結檔案,ln 指令預設就是建立硬連結: # 建立硬連結 ln test.txt test_hardlink.txt 這樣就會建立一個 test_hardlink.txt 硬連結檔,指向 test.txt 這個檔案。 建立了硬連結之後,可以查看一下 inode: # 查看 inode ls -i test.txt test_hardlink.txt 787682 test_hardlink.txt    787682 test.txt 硬連結會跟原來的檔案有相同的 inode。 建立軟連結 軟連結(符號連結)則是靠著絕對路徑或相對路徑來指向目標檔案的連結檔,若要使用 ln 指令建立軟連結,可以加上 -s 參數: # 建立軟連結 ln -s test.txt test_softlink.txt 這樣就會建立一個 test_softlink.txt 軟連結檔,指向 test.txt 這個檔案。 查看一下 inode: # 查看 inode ls -i test.txt test_softlink.txt 792852 test_softlink.txt    787682 test.txt 軟連結的 inode 就會跟原始的檔案不相同。 路徑 在建立連結檔案時,亦可使用相對路徑或是絕對路徑,例如: # 使用相對路徑 ln -s ../source/test.txt test.txt # 使用絕對路徑 ln -s /home/gtwang/source/test.txt test.txt 由於軟連結是直接靠著路徑來指向目標檔案的,所以對於軟連結來說,使用相對路徑與絕對路徑所建立的連結檔案效果會有不同,在搬移軟連結檔案時,以絕對路徑所建立的連結檔還是會指向相同的位...