發表文章

目前顯示的是 10月, 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...