intmain(){ char buffer1[] = "abcde"; char buffer2[] = "abcde"; int ret = memcmp(buffer1, buffer2, sizeof(buffer1)); if (ret > 0) { printf("buffer1 is greater than buffer2\n"); } elseif (ret < 0) { printf("buffer1 is less than buffer2\n"); } else { // ret == 0 printf("buffer1 is equal to buffer2\n"); }
intmain(){ char buffer1[] = "abcde"; char buffer2[] = "ABCDE"; int ret = memcmp(buffer1, buffer2, sizeof(buffer1)); if (ret > 0) { printf("buffer1 is greater than buffer2\n"); } elseif (ret < 0) { printf("buffer1 is less than buffer2\n"); } else { // ret == 0 printf("buffer1 is equal to buffer2\n"); }
intmain(){ char buffer1[] = "abcde"; char buffer2[] = "abcDE"; int ret = memcmp(buffer1, buffer2, 3); if (ret > 0) { printf("buffer1 is greater than buffer2\n"); } elseif (ret < 0) { printf("buffer1 is less than buffer2\n"); } else { // ret == 0 printf("buffer1 is equal to buffer2\n"); }
intmain(){ constchar *str1 = "hello world"; constchar *str2 = "HELLO WORLD"; int ret = strncmp(str1, str2, strlen(str1)); if (ret > 0) { printf("str1 is greater than str2\n"); } elseif (ret < 0) { printf("str1 is less than str2\n"); } else { // ret == 0 printf("str1 is equal to str2\n"); }
iv 就是初始向量 (Initialization Vector),在加密過程中,原本相同明文區塊使用相同金鑰加密後的密文會相同,加入 iv 可讓每次的相同明文區塊使用相同金鑰加密後的密文不同, 用來防止同樣的內容產生同樣的加密資料,解密時用的 iv 必須跟加密的 iv 內容一樣,長度必須為 16 bytes (128 bits),在使用 AES_cbc_encrypt() 加密時會修改 iv 的數值,所以在 aes_cbc_decrypt() 解密時務必確認是用相同的 iv。
另外 openssl command 還提供了 salt 的選項,salt 就是加鹽的意思,是個隨機產生的資料,在密碼 password 推導成金鑰 key 時可以使用,使用 salt 的話相同的密碼 password 就不會每次都推導成相同的金鑰 key 了。
後來 openssl 還有推出了 EVP 的 API,EVP 的 API 提供了所有對稱式加密演算法的統一介面,對開發者來說就可以很輕易的就換成其他演算法,另外 EVP API 還有硬體加速的部分,關於 EVP API 的討論可以看看這篇與這篇,下一篇就介紹怎麼用 EVP API 來寫 AES-256 CBC。