Android C、C++与java端3DES互通

<div id="article\_content" class="article\_content clearfix"> <div class="article-copyright"> <span class="creativecommons"> <a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/"> </a> <span> 版权声明:本文为博主原创文章,遵循<a href="http://creativecommons.org/licenses/by-sa/4.0/" target="\_blank" rel="noopener"> CC 4.0 BY-SA </a>版权协议,转载请附上原文出处链接和本声明。 </span> <div class="article-source-link2222"> 本文链接:<a href="https://blog.csdn.net/zxdscn/article/details/78104659">https://blog.csdn.net/zxdscn/article/details/78104659</a> </div> </span> </div> <!--一个博主专栏付费入口-->
1 <!--一个博主专栏付费入口结束--> 2 <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-d284373521.css"> 3 <div id="content_views" class="markdown_views"> 4 <!-- flowchart 箭头图标 勿删 --> 5 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"> 6 <path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path> 7 </svg> 8 <ol>
<li>为了使C端与java端的3des加解密互通,我们一般使用<strong>“DESede/ECB/NoPadding”</strong>加密模式;</li> <li>而在我们java端,我们都知道3des的密钥都是24字节的,而C端是16字节,此处为重点:<strong>我们java端的密钥组成为16字节密钥 + 其前8个字节组成24字节密钥</strong>;</li> <li>请看代码:</li> </ol> <pre class="prettyprint" name="code"><code class="hljs cs has-numbering" onclick="mdcp.copyCode(event)" style="position: unset;"><span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">byte</span>\[\] <span class="hljs-title">fillTo24</span>(<span class="hljs-keyword">byte</span>\[\] key) { <span class="hljs-keyword">if</span> (<span class="hljs-keyword">null</span> != key &amp;&amp; key.length == <span class="hljs-number">16</span>) { <span class="hljs-keyword">return</span> Util.pinJie2(key, Util.subBytes(key, <span class="hljs-number">0</span>, <span class="hljs-number">8</span>)); } <span class="hljs-keyword">return</span> <span class="hljs-keyword">null</span>; }<div class="hljs-button {2}" data-title="复制"></div></code><ul class="pre-numbering" style=""><li style="color: rgb(153, 153, 153);">1</li><li style="color: rgb(153, 153, 153);">2</li><li style="color: rgb(153, 153, 153);">3</li><li style="color: rgb(153, 153, 153);">4</li><li style="color: rgb(153, 153, 153);">5</li><li style="color: rgb(153, 153, 153);">6</li></ul></pre> <ol> <li>全部代码为:</li> </ol> <pre class="prettyprint" name="code"><code class="hljs java has-numbering" onclick="mdcp.copyCode(event)" style="position: unset;"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">DES3Utils</span> {</span> <span class="hljs-comment">// 向量</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">final</span> <span class="hljs-keyword">static</span> String iv = <span class="hljs-string">"12345678"</span>; <span class="hljs-comment">// 3des加密</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> String algorithm = <span class="hljs-string">"DESede"</span>; <span class="hljs-comment">// 加密 src为源数据的字节数组</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">byte</span>\[\] <span class="hljs-title">encryptBy3DES</span>(<span class="hljs-keyword">byte</span>\[\] src, <span class="hljs-keyword">byte</span>\[\] key) { <span class="hljs-keyword">return</span> init(src, key, <span class="hljs-keyword">true</span>, <span class="hljs-number">0</span>); } <span class="hljs-comment">// 解密函数</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">byte</span>\[\] <span class="hljs-title">decryptBy3DES</span>(<span class="hljs-keyword">byte</span>\[\] src, <span class="hljs-keyword">byte</span>\[\] key) { <span class="hljs-keyword">return</span> init(src, key, <span class="hljs-keyword">false</span>, <span class="hljs-number">0</span>); } <span class="hljs-javadoc">/\*\* \*<span class="hljs-javadoctag"> @param</span> src 需要加密的文字 \*<span class="hljs-javadoctag"> @return</span> 加密后的文字 \*<span class="hljs-javadoctag"> @throws</span> Exception 加密失败 \*/</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">byte</span>\[\] <span class="hljs-title">encryptBy3DESCBC</span>(<span class="hljs-keyword">byte</span>\[\] src, <span class="hljs-keyword">byte</span>\[\] key) { <span class="hljs-keyword">byte</span>\[\] fillTo24 = fillTo24(key); <span class="hljs-keyword">if</span> (<span class="hljs-keyword">null</span> == fillTo24) <span class="hljs-keyword">return</span> <span class="hljs-keyword">null</span>; <span class="hljs-keyword">try</span> { SecretKey deskey = <span class="hljs-keyword">new</span> SecretKeySpec(fillTo24, algorithm); Cipher cipher = Cipher.getInstance(<span class="hljs-string">"DESede/CBC/PKCS5Padding"</span>); IvParameterSpec ips = <span class="hljs-keyword">new</span> IvParameterSpec(iv.getBytes()); cipher.init(Cipher.ENCRYPT\_MODE, deskey, ips); <span class="hljs-keyword">return</span> cipher.doFinal(src); } <span class="hljs-keyword">catch</span> (Exception e) { e.printStackTrace(); } <span class="hljs-keyword">return</span> <span class="hljs-keyword">null</span>; } <span class="hljs-javadoc">/\*\* \* 3DES解密 \* \*<span class="hljs-javadoctag"> @param</span> encryptText 加密文本 \*<span class="hljs-javadoctag"> @return</span> \*<span class="hljs-javadoctag"> @throws</span> Exception \*/</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">byte</span>\[\] <span class="hljs-title">decryptBy3DESCBC</span>(<span class="hljs-keyword">byte</span>\[\] encryptText, <span class="hljs-keyword">byte</span>\[\] key) { <span class="hljs-keyword">byte</span>\[\] fillTo24 = fillTo24(key); <span class="hljs-keyword">if</span> (<span class="hljs-keyword">null</span> == fillTo24) <span class="hljs-keyword">return</span> <span class="hljs-keyword">null</span>; <span class="hljs-keyword">try</span> { SecretKey deskey = <span class="hljs-keyword">new</span> SecretKeySpec(fillTo24, algorithm); Cipher cipher = Cipher.getInstance(<span class="hljs-string">"DESede/CBC/PKCS5Padding"</span>); IvParameterSpec ips = <span class="hljs-keyword">new</span> IvParameterSpec(iv.getBytes()); cipher.init(Cipher.DECRYPT\_MODE, deskey, ips); <span class="hljs-keyword">return</span> cipher.doFinal(encryptText); } <span class="hljs-keyword">catch</span> (Exception e) { e.printStackTrace(); } <span class="hljs-keyword">return</span> <span class="hljs-keyword">null</span>; } <span class="hljs-javadoc">/\*\* \*<span class="hljs-javadoctag"> @param</span> src 需要加密的文字 \*<span class="hljs-javadoctag"> @return</span> 加密后的文字 \*<span class="hljs-javadoctag"> @throws</span> Exception 加密失败 \*/</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">byte</span>\[\] <span class="hljs-title">encryptBy3DESECB</span>(<span class="hljs-keyword">byte</span>\[\] src, <span class="hljs-keyword">byte</span>\[\] key) { <span class="hljs-keyword">return</span> init(src, key, <span class="hljs-keyword">true</span>, <span class="hljs-number">1</span>); } <span class="hljs-javadoc">/\*\* \* 3DES解密 \* \*<span class="hljs-javadoctag"> @param</span> encryptText 加密文本 \*<span class="hljs-javadoctag"> @return</span> \*<span class="hljs-javadoctag"> @throws</span> Exception \*/</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">byte</span>\[\] <span class="hljs-title">decryptBy3DESECB</span>(<span class="hljs-keyword">byte</span>\[\] encryptText, <span class="hljs-keyword">byte</span>\[\] key) { <span class="hljs-keyword">return</span> init(encryptText, key, <span class="hljs-keyword">false</span>, <span class="hljs-number">1</span>); } <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">byte</span>\[\] <span class="hljs-title">init</span>(<span class="hljs-keyword">byte</span>\[\] data, <span class="hljs-keyword">byte</span>\[\] key, <span class="hljs-keyword">boolean</span> mode, <span class="hljs-keyword">int</span> type) { <span class="hljs-keyword">byte</span>\[\] fillTo24 = fillTo24(key); <span class="hljs-keyword">if</span> (<span class="hljs-keyword">null</span> == fillTo24) <span class="hljs-keyword">return</span> <span class="hljs-keyword">null</span>; String types = <span class="hljs-keyword">null</span>; <span class="hljs-keyword">try</span> { SecretKey deskey = <span class="hljs-keyword">new</span> SecretKeySpec(fillTo24, algorithm); <span class="hljs-keyword">switch</span> (type) { <span class="hljs-keyword">case</span> <span class="hljs-number">0</span>: types = <span class="hljs-string">"DESede"</span>; <span class="hljs-keyword">break</span>; <span class="hljs-keyword">case</span> <span class="hljs-number">1</span>: types = <span class="hljs-string">"DESede/ECB/NoPadding"</span>; <span class="hljs-keyword">break</span>; <span class="hljs-keyword">case</span> <span class="hljs-number">2</span>: types = <span class="hljs-string">"DESede/ECB/PKCS5Padding"</span>; <span class="hljs-keyword">break</span>; } Cipher cipher = Cipher.getInstance(types); <span class="hljs-keyword">if</span> (mode) cipher.init(Cipher.ENCRYPT\_MODE, deskey); <span class="hljs-keyword">else</span> cipher.init(Cipher.DECRYPT\_MODE, deskey); <span class="hljs-keyword">return</span> cipher.doFinal(data); } <span class="hljs-keyword">catch</span> (Exception e) { e.printStackTrace(); } <span class="hljs-keyword">return</span> <span class="hljs-keyword">null</span>; } <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">byte</span>\[\] <span class="hljs-title">fillTo24</span>(<span class="hljs-keyword">byte</span>\[\] key) { <span class="hljs-keyword">if</span> (<span class="hljs-keyword">null</span> != key &amp;&amp; key.length == <span class="hljs-number">16</span>) { <span class="hljs-keyword">return</span> Util.pinJie2(key, Util.subBytes(key, <span class="hljs-number">0</span>, <span class="hljs-number">8</span>)); } <span class="hljs-keyword">return</span> <span class="hljs-keyword">null</span>; } }<div class="hljs-button {2}" data-title="复制"></div></code><ul class="pre-numbering" style=""><li style="color: rgb(153, 153, 153);">1</li><li style="color: rgb(153, 153, 153);">2</li><li style="color: rgb(153, 153, 153);">3</li><li style="color: rgb(153, 153, 153);">4</li><li style="color: rgb(153, 153, 153);">5</li><li style="color: rgb(153, 153, 153);">6</li><li style="color: rgb(153, 153, 153);">7</li><li style="color: rgb(153, 153, 153);">8</li><li style="color: rgb(153, 153, 153);">9</li><li style="color: rgb(153, 153, 153);">10</li><li style="color: rgb(153, 153, 153);">11</li><li style="color: rgb(153, 153, 153);">12</li><li style="color: rgb(153, 153, 153);">13</li><li style="color: rgb(153, 153, 153);">14</li><li style="color: rgb(153, 153, 153);">15</li><li style="color: rgb(153, 153, 153);">16</li><li style="color: rgb(153, 153, 153);">17</li><li style="color: rgb(153, 153, 153);">18</li><li style="color: rgb(153, 153, 153);">19</li><li style="color: rgb(153, 153, 153);">20</li><li style="color: rgb(153, 153, 153);">21</li><li style="color: rgb(153, 153, 153);">22</li><li style="color: rgb(153, 153, 153);">23</li><li style="color: rgb(153, 153, 153);">24</li><li style="color: rgb(153, 153, 153);">25</li><li style="color: rgb(153, 153, 153);">26</li><li style="color: rgb(153, 153, 153);">27</li><li style="color: rgb(153, 153, 153);">28</li><li style="color: rgb(153, 153, 153);">29</li><li style="color: rgb(153, 153, 153);">30</li><li style="color: rgb(153, 153, 153);">31</li><li style="color: rgb(153, 153, 153);">32</li><li style="color: rgb(153, 153, 153);">33</li><li style="color: rgb(153, 153, 153);">34</li><li style="color: rgb(153, 153, 153);">35</li><li style="color: rgb(153, 153, 153);">36</li><li style="color: rgb(153, 153, 153);">37</li><li style="color: rgb(153, 153, 153);">38</li><li style="color: rgb(153, 153, 153);">39</li><li style="color: rgb(153, 153, 153);">40</li><li style="color: rgb(153, 153, 153);">41</li><li style="color: rgb(153, 153, 153);">42</li><li style="color: rgb(153, 153, 153);">43</li><li style="color: rgb(153, 153, 153);">44</li><li style="color: rgb(153, 153, 153);">45</li><li style="color: rgb(153, 153, 153);">46</li><li style="color: rgb(153, 153, 153);">47</li><li style="color: rgb(153, 153, 153);">48</li><li style="color: rgb(153, 153, 153);">49</li><li style="color: rgb(153, 153, 153);">50</li><li style="color: rgb(153, 153, 153);">51</li><li style="color: rgb(153, 153, 153);">52</li><li style="color: rgb(153, 153, 153);">53</li><li style="color: rgb(153, 153, 153);">54</li><li style="color: rgb(153, 153, 153);">55</li><li style="color: rgb(153, 153, 153);">56</li><li style="color: rgb(153, 153, 153);">57</li><li style="color: rgb(153, 153, 153);">58</li><li style="color: rgb(153, 153, 153);">59</li><li style="color: rgb(153, 153, 153);">60</li><li style="color: rgb(153, 153, 153);">61</li><li style="color: rgb(153, 153, 153);">62</li><li style="color: rgb(153, 153, 153);">63</li><li style="color: rgb(153, 153, 153);">64</li><li style="color: rgb(153, 153, 153);">65</li><li style="color: rgb(153, 153, 153);">66</li><li style="color: rgb(153, 153, 153);">67</li><li style="color: rgb(153, 153, 153);">68</li><li style="color: rgb(153, 153, 153);">69</li><li style="color: rgb(153, 153, 153);">70</li><li style="color: rgb(153, 153, 153);">71</li><li style="color: rgb(153, 153, 153);">72</li><li style="color: rgb(153, 153, 153);">73</li><li style="color: rgb(153, 153, 153);">74</li><li style="color: rgb(153, 153, 153);">75</li><li style="color: rgb(153, 153, 153);">76</li><li style="color: rgb(153, 153, 153);">77</li><li style="color: rgb(153, 153, 153);">78</li><li style="color: rgb(153, 153, 153);">79</li><li style="color: rgb(153, 153, 153);">80</li><li style="color: rgb(153, 153, 153);">81</li><li style="color: rgb(153, 153, 153);">82</li><li style="color: rgb(153, 153, 153);">83</li><li style="color: rgb(153, 153, 153);">84</li><li style="color: rgb(153, 153, 153);">85</li><li style="color: rgb(153, 153, 153);">86</li><li style="color: rgb(153, 153, 153);">87</li><li style="color: rgb(153, 153, 153);">88</li><li style="color: rgb(153, 153, 153);">89</li><li style="color: rgb(153, 153, 153);">90</li><li style="color: rgb(153, 153, 153);">91</li><li style="color: rgb(153, 153, 153);">92</li><li style="color: rgb(153, 153, 153);">93</li><li style="color: rgb(153, 153, 153);">94</li><li style="color: rgb(153, 153, 153);">95</li><li style="color: rgb(153, 153, 153);">96</li><li style="color: rgb(153, 153, 153);">97</li><li style="color: rgb(153, 153, 153);">98</li><li style="color: rgb(153, 153, 153);">99</li><li style="color: rgb(153, 153, 153);">100</li><li style="color: rgb(153, 153, 153);">101</li><li style="color: rgb(153, 153, 153);">102</li><li style="color: rgb(153, 153, 153);">103</li><li style="color: rgb(153, 153, 153);">104</li><li style="color: rgb(153, 153, 153);">105</li><li style="color: rgb(153, 153, 153);">106</li><li style="color: rgb(153, 153, 153);">107</li><li style="color: rgb(153, 153, 153);">108</li><li style="color: rgb(153, 153, 153);">109</li><li style="color: rgb(153, 153, 153);">110</li><li style="color: rgb(153, 153, 153);">111</li><li style="color: rgb(153, 153, 153);">112</li><li style="color: rgb(153, 153, 153);">113</li><li style="color: rgb(153, 153, 153);">114</li><li style="color: rgb(153, 153, 153);">115</li><li style="color: rgb(153, 153, 153);">116</li></ul></pre> </div>
1 <link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-526ced5128.css" rel="stylesheet"> 2 </div>
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

AndroidStudio封装SDK的那些事

<divclass"markdown\_views"<!flowchart箭头图标勿删<svgxmlns"http://www.w3.org/2000/svg"style"display:none;"<pathstrokelinecap"round"d"M5,00,2.55,5z"id"raphael

PhoneGap设置Icon

参考:http://cordova.apache.org/docs/en/latest/config\_ref/images.html通过config.xml中的<icon标签来设置Icon<iconsrc"res/ios/icon.png"platform"ios"width"57"height"57"densi

Android C、C++与java端3DES互通 - HelloWorld