{"id":1021,"date":"2014-08-25T12:43:17","date_gmt":"2014-08-25T04:43:17","guid":{"rendered":"http:\/\/www.awaysoft.com\/taor\/?p=1021"},"modified":"2015-05-18T09:23:29","modified_gmt":"2015-05-18T01:23:29","slug":"aes-cbc-%e7%9b%b8%e4%ba%92%e5%8a%a0%e8%a7%a3%e5%af%86-javaphpc","status":"publish","type":"post","link":"https:\/\/actom.me\/blog\/aes-cbc-%e7%9b%b8%e4%ba%92%e5%8a%a0%e8%a7%a3%e5%af%86-javaphpc.html","title":{"rendered":"AES CBC \u76f8\u4e92\u52a0\u89e3\u5bc6 Java\/PHP\/C++"},"content":{"rendered":"<p>\u9879\u76ee\u4e2d\u9700\u8981\u7528\u5230\u52a0\u5bc6\u901a\u8baf\uff0c\u56e0\u4e3a\u670d\u52a1\u5668\u662f\u7528php\u5199\u7684\uff0c\u91c7\u7528\u4e86AES CBC 128\u4f4d\u52a0\u5bc6\uff0c\u7531\u4e8e\u662f\u5185\u90e8\u7cfb\u7edf\uff0c\u6240\u4ee5\u5411\u91cfiv\u5c31\u9ed8\u8ba4\u5185\u7f6e\u4e86\u3002\u5f53\u7136\u4e5f\u53ef\u4ee5\u91c7\u7528\u4e0eaeskey\u4e00\u8d77\u5b58\u50a8\uff0c\u52a0\u89e3\u5bc6\u7684\u65f6\u5019\u5206\u79bb\u3002<\/p>\n<p><!--more--><\/p>\n<p>\u4e0b\u9762\u662f\u4ee3\u7801\uff1a<\/p>\n<p>PHP:<\/p>\n<pre class=\"lang:php decode:true \">$iv = \"1234567890123456\"; \/* \u5fc5\u987b16\u4f4d\u54e6 *\/\r\n\r\n\/* \u91c7\u7528128\u4f4d\u52a0\u5bc6\uff0c\u5bc6\u94a5\u4e5f\u5fc5\u987b\u662f16\u4f4d *\/\r\nfunction aes_encode($sourcestr, $key)\r\n{\r\n    global $iv;\r\n    return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $sourcestr, MCRYPT_MODE_CBC, $iv));\r\n}\r\n\r\nfunction aes_decode($crypttext, $key)\r\n{\r\n    global $iv;\r\n    return rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, base64_decode($crypttext), MCRYPT_MODE_CBC, $iv), \"\\0\");\r\n}<\/pre>\n<p>Java:<\/p>\n<pre class=\"lang:java decode:true \">import javax.crypto.Cipher;\r\nimport javax.crypto.spec.IvParameterSpec;\r\nimport javax.crypto.spec.SecretKeySpec;\r\n\r\nimport com.android.util.BASE64.BASE64Decoder;\r\nimport com.android.util.BASE64.BASE64Encoder;\r\n\/**\r\n *\r\n * @author Tom\r\n *\/\r\npublic class NewAes {\r\n    \r\n    public static String iv = \"1234567890123456\";\r\n    \r\n    public static String Encrypt(String sSrc, String sKey) throws Exception {  \r\n        if (sKey == null) {  \r\n            System.out.print(\"Key\u4e3a\u7a7anull\");  \r\n            return null;  \r\n        }  \r\n        \/\/ \u5224\u65adKey\u662f\u5426\u4e3a16\u4f4d  \r\n        if (sKey.length() != 16) {  \r\n            System.out.print(\"Key\u957f\u5ea6\u4e0d\u662f16\u4f4d\");  \r\n            return null;  \r\n        }  \r\n        byte[] raw = sKey.getBytes();  \r\n        SecretKeySpec skeySpec = new SecretKeySpec(raw, \"AES\");  \r\n        Cipher cipher = Cipher.getInstance(\"AES\/CBC\/NoPadding\");\/\/\"\u7b97\u6cd5\/\u6a21\u5f0f\/\u8865\u7801\u65b9\u5f0f\"  \r\n        IvParameterSpec iv = new IvParameterSpec(NewAes.iv.getBytes());\/\/\u4f7f\u7528CBC\u6a21\u5f0f\uff0c\u9700\u8981\u4e00\u4e2a\u5411\u91cfiv\uff0c\u53ef\u589e\u52a0\u52a0\u5bc6\u7b97\u6cd5\u7684\u5f3a\u5ea6  \r\n        cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);  \r\n       \r\n        byte[] srawt = sSrc.getBytes();\r\n        int len = srawt.length;\r\n        \/* \u8ba1\u7b97\u88650\u540e\u7684\u957f\u5ea6 *\/\r\n        while(len % 16 != 0) len ++;\r\n        byte[] sraw = new byte[len];\r\n        \/* \u5728\u6700\u540e\u88650 *\/\r\n        for (int i = 0; i &lt; len; ++i) {\r\n            if (i &lt; srawt.length) {\r\n                sraw[i] = srawt[i];\r\n            } else {\r\n                sraw[i] = 0;\r\n            }\r\n        }\r\n        byte[] encrypted = cipher.doFinal(sraw);  \r\n  \r\n        return new BASE64Encoder().encode(encrypted);\/\/\u6b64\u5904\u4f7f\u7528BASE64\u505a\u8f6c\u7801\u529f\u80fd\uff0c\u540c\u65f6\u80fd\u8d77\u52302\u6b21\u52a0\u5bc6\u7684\u4f5c\u7528\u3002  \r\n    }  \r\n  \r\n    \/\/ \u89e3\u5bc6  \r\n    public static String Decrypt(String sSrc, String sKey) throws Exception {  \r\n        try {  \r\n            \/\/ \u5224\u65adKey\u662f\u5426\u6b63\u786e  \r\n            if (sKey == null) {  \r\n                System.out.print(\"Key\u4e3a\u7a7anull\");  \r\n                return null;  \r\n            }  \r\n            \/\/ \u5224\u65adKey\u662f\u5426\u4e3a16\u4f4d  \r\n            if (sKey.length() != 16) {  \r\n                System.out.print(\"Key\u957f\u5ea6\u4e0d\u662f16\u4f4d\");  \r\n                return null;  \r\n            }  \r\n            System.out.println(\"key is:\"+sKey);\r\n            byte[] raw = sKey.getBytes(\"ASCII\");  \r\n            SecretKeySpec skeySpec = new SecretKeySpec(raw, \"AES\");  \r\n            Cipher cipher = Cipher.getInstance(\"AES\/CBC\/NoPadding\");  \r\n            IvParameterSpec iv = new IvParameterSpec(NewAes.iv.getBytes());  \r\n            cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);  \r\n            byte[] encrypted1 = new BASE64Decoder().decodeBuffer(sSrc);\/\/\u5148\u7528base64\u89e3\u5bc6  \r\n            try {  \r\n                byte[] original = cipher.doFinal(encrypted1);  \r\n                String originalString = new String(original);  \r\n                return originalString.trim();  \r\n            } catch (Exception e) {  \r\n                System.out.println(e.toString());  \r\n                return null;  \r\n            }  \r\n        } catch (Exception ex) {  \r\n            System.out.println(ex.toString());  \r\n            return null;  \r\n        }  \r\n    } \r\n}\r\n<\/pre>\n<p>C++:<\/p>\n<pre class=\"lang:c++ decode:true  \">char *CryptObject::aes_encode(const char *sourcestr, char *key = \"\")\r\n{\r\n    if (strcmp(key, \"\") == 0) key = aeskey;\r\n\r\n    int len = strlen(sourcestr);\r\n    unsigned char iv[AES_BLOCK_SIZE+1] = \"6543210987654321\";  \/\/ \u6ce8\u610f\uff0civ\u7edd\u5bf9\u4e0d\u80fd\u662fconst\u7684\uff0c\u5426\u5219\u4f1a\u6bb5\u9519\u8bef\r\n\r\n    unsigned char * out = (unsigned char *)malloc(1024*1024);\r\n    if (out == NULL) {\r\n        fprintf(stderr, \"No Memory!\\n\");\r\n    }\r\n    AES_KEY aes;\r\n    if(AES_set_encrypt_key((unsigned char*)key, 128, &amp;aes) &lt; 0)\r\n    {\r\n        return NULL;\r\n    }\r\n    \/* \u8ba1\u7b97\u88650\u540e\u7684\u957f\u5ea6 *\/\r\n    int out_len = ((len - 1) \/ 16 + 1)* 16;\r\n    char * sstr = (char *)malloc(sizeof(char) * out_len + 1);\r\n    \/* \u88650 *\/\r\n    memset(sstr, 0, out_len+1);\r\n    strcpy(sstr, sourcestr);\r\n    AES_cbc_encrypt((unsigned char*)sstr, out, out_len, &amp;aes, (unsigned char*)iv, AES_ENCRYPT);\r\n    \/* \u8fd9\u91cc\u7684\u957f\u5ea6\u4e00\u5b9a\u8981\u6ce8\u610f\uff0c\u4e0d\u80fd\u7528strlen\u6765\u83b7\u53d6\uff0c\u52a0\u5bc6\u540e\u7684\u5b57\u7b26\u4e32\u4e2d\u53ef\u80fd\u4f1a\u5305\u542b\\0 *\/\r\n    char * out2 = base64_encode((char *)out, out_len);\r\n    free(out);\r\n    free(sstr);\r\n    return out2;\r\n}\r\n\r\nchar *CryptObject::aes_decode(const char *crypttext, char *key = \"\")\r\n{\r\n    if (strcmp(key, \"\") == 0) key = aeskey;\r\n    int out_len = 0;\r\n    unsigned char iv[AES_BLOCK_SIZE+1] = \"6543210987654321\";\r\n\r\n    char *in = base64_decode(crypttext, strlen(crypttext), out_len);\r\n    char *out = (char *) malloc(sizeof(char) * out_len + 1);\r\n    memset(out, 0, out_len + 1);\r\n    AES_KEY aes;\r\n    if(AES_set_decrypt_key((unsigned char*)key, 128, &amp;aes) &lt; 0)\r\n    {\r\n        return NULL;\r\n    }\r\n\r\n    AES_cbc_encrypt((unsigned char*)in, (unsigned char*)out, out_len, &amp;aes, (unsigned char*)iv, AES_DECRYPT);\r\n    free(in);\r\n    return out;\r\n}\r\n\r\nchar *CryptObject::base64_encode(const char *data, int data_len)\r\n{\r\n    int prepare = 0;\r\n    int ret_len;\r\n    int temp = 0;\r\n    char *ret = NULL;\r\n    char *f = NULL;\r\n    int tmp = 0;\r\n    char changed[4];\r\n    int i = 0;\r\n    ret_len = data_len \/ 3;\r\n    temp = data_len % 3;\r\n    if (temp &gt; 0)\r\n    {\r\n\tret_len += 1;\r\n    }\r\n    ret_len = ret_len*4 + 1;\r\n    ret = (char *)malloc(ret_len);\r\n\r\n    if ( ret == NULL)\r\n    {\r\n\tprintf(\"No enough memory.\\n\");\r\n\texit(0);\r\n    }\r\n    memset(ret, 0, ret_len);\r\n    f = ret;\r\n    while (tmp &lt; data_len)\r\n    {\r\n\ttemp = 0;\r\n\tprepare = 0;\r\n\tmemset(changed, '\\0', 4);\r\n\twhile (temp &lt; 3)\r\n\t{\r\n\t    \/\/printf(\"tmp = %d\\n\", tmp);\r\n\t    if (tmp &gt;= data_len)\r\n\t    {\r\n\t\tbreak;\r\n\t    }\r\n\t    prepare = ((prepare &lt;&lt; 8) | (data[tmp] &amp; 0xFF));\r\n\t    tmp++;\r\n\t    temp++;\r\n\t}\r\n\tprepare = (prepare&lt;&lt;((3-temp)*8));\r\n\t\/\/printf(\"before for : temp = %d, prepare = %d\\n\", temp, prepare);\r\n\tfor (i = 0; i &lt; 4 ;i++ )\r\n\t{\r\n\t    if (temp &lt; i)\r\n\t    {\r\n\t\tchanged[i] = 0x40;\r\n\t    }\r\n\t    else\r\n\t    {\r\n\t\tchanged[i] = (prepare&gt;&gt;((3-i)*6)) &amp; 0x3F;\r\n\t    }\r\n\t    *f = base[changed[i]];\r\n\t    \/\/printf(\"%.2X\", changed[i]);\r\n\t    f++;\r\n\t}\r\n    }\r\n    *f = '\\0';\r\n\r\n    return ret;\r\n}\r\n\r\n\/* out_len \u89e3\u7801\u540e\u7684\u6570\u636e\u957f\u5ea6 *\/\r\nchar *CryptObject::base64_decode(const char *data, int data_len, int &amp;out_len)\r\n{\r\n    int ret_len = (data_len \/ 4) * 3;\r\n    int equal_count = 0;\r\n    char *ret = NULL;\r\n    char *f = NULL;\r\n    int tmp = 0;\r\n    int temp = 0;\r\n    char need[3];\r\n    int prepare = 0;\r\n    int i = 0;\r\n    if (*(data + data_len - 1) == '=')\r\n    {\r\n\tequal_count += 1;\r\n    }\r\n    if (*(data + data_len - 2) == '=')\r\n    {\r\n\tequal_count += 1;\r\n    }\r\n    if (*(data + data_len - 3) == '=')\r\n    {\/\/seems impossible\r\n\tequal_count += 1;\r\n    }\r\n    switch (equal_count)\r\n    {\r\n    case 0:\r\n\tret_len += 4;\/\/3 + 1 [1 for NULL]\r\n\tbreak;\r\n    case 1:\r\n\tret_len += 4;\/\/Ceil((6*3)\/8)+1\r\n\tbreak;\r\n    case 2:\r\n\tret_len += 3;\/\/Ceil((6*2)\/8)+1\r\n\tbreak;\r\n    case 3:\r\n\tret_len += 2;\/\/Ceil((6*1)\/8)+1\r\n\tbreak;\r\n    }\r\n    ret = (char *)malloc(ret_len);\r\n    if (ret == NULL)\r\n    {\r\n\tprintf(\"No enough memory.\\n\");\r\n\texit(0);\r\n    }\r\n    memset(ret, 0, ret_len);\r\n    f = ret;\r\n    while (tmp &lt; (data_len - equal_count))\r\n    {\r\n\ttemp = 0;\r\n\tprepare = 0;\r\n\tmemset(need, 0, 3);\r\n\twhile (temp &lt; 4)\r\n\t{\r\n\t    if (tmp &gt;= (data_len - equal_count))\r\n\t    {\r\n\t\tbreak;\r\n\t    }\r\n\t    prepare = (prepare &lt;&lt; 6) | (find_pos(data[tmp]));\r\n\t    temp++;\r\n\t    tmp++;\r\n\t}\r\n\tprepare = prepare &lt;&lt; ((4-temp) * 6);\r\n\tfor (i=0; i&lt;3 ;i++ )\r\n\t{\r\n\t    if (i == temp)\r\n\t    {\r\n\t\tbreak;\r\n\t    }\r\n\t    *f = (char)((prepare&gt;&gt;((2-i)*8)) &amp; 0xFF);\r\n\t    f++;\r\n\t}\r\n    }\r\n    *f = '\\0';\r\n    out_len = (int)(f - ret);\r\n    if (out_len &lt; 0) out_len = 0;\r\n    return ret;\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u9879\u76ee\u4e2d\u9700\u8981\u7528\u5230\u52a0\u5bc6\u901a\u8baf\uff0c\u56e0\u4e3a\u670d\u52a1\u5668\u662f\u7528php\u5199\u7684\uff0c\u91c7\u7528\u4e86AES CBC 128\u4f4d &#8230; <a class=\"more-link\" href=\"https:\/\/actom.me\/blog\/aes-cbc-%e7%9b%b8%e4%ba%92%e5%8a%a0%e8%a7%a3%e5%af%86-javaphpc.html\">Read More &raquo;<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"_links":{"self":[{"href":"https:\/\/actom.me\/blog\/wp-json\/wp\/v2\/posts\/1021"}],"collection":[{"href":"https:\/\/actom.me\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/actom.me\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/actom.me\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/actom.me\/blog\/wp-json\/wp\/v2\/comments?post=1021"}],"version-history":[{"count":3,"href":"https:\/\/actom.me\/blog\/wp-json\/wp\/v2\/posts\/1021\/revisions"}],"predecessor-version":[{"id":1176,"href":"https:\/\/actom.me\/blog\/wp-json\/wp\/v2\/posts\/1021\/revisions\/1176"}],"wp:attachment":[{"href":"https:\/\/actom.me\/blog\/wp-json\/wp\/v2\/media?parent=1021"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/actom.me\/blog\/wp-json\/wp\/v2\/categories?post=1021"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/actom.me\/blog\/wp-json\/wp\/v2\/tags?post=1021"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}