<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 && 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 && 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>