DES加密和解密PHP,Java,ObjectC统一的方法
原文:DES加密和解密PHP,Java,ObjectC统一的方法
PHP的加解密函数
- <?php
- class DesComponent {
- var $key = '12345678';
- function encrypt($string) {
- $ivArray=array(0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF);
- $iv=null;
- foreach ($ivArray as $element)
- $iv.=CHR($element);
- $size = mcrypt_get_block_size ( MCRYPT_DES, MCRYPT_MODE_CBC );
- $string = $this->pkcs5Pad ( $string, $size );
- $data = mcrypt_encrypt(MCRYPT_DES, $this->key, $string, MCRYPT_MODE_CBC, $iv);
- $data = base64_encode($data);
- return $data;
- }
- function decrypt($string) {
- $ivArray=array(0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF);
- $iv=null;
- foreach ($ivArray as $element)
- $iv.=CHR($element);
- $string = base64_decode($string);
- //echo("****");
- //echo($string);
- //echo("****");
- $result = mcrypt_decrypt(MCRYPT_DES, $this->key, $string, MCRYPT_MODE_CBC, $iv);
- $result = $this->pkcs5Unpad( $result );
- return $result;
- }
- function pkcs5Pad($text, $blocksize)
- {
- $pad = $blocksize - (strlen ( $text ) % $blocksize);
- return $text . str_repeat ( chr ( $pad ), $pad );
- }
- function pkcs5Unpad($text)
- {
- $pad = ord ( $text {strlen ( $text ) - 1} );
- if ($pad > strlen ( $text ))
- return false;
- if (strspn ( $text, chr ( $pad ), strlen ( $text ) - $pad ) != $pad)
- return false;
- return substr ( $text, 0, - 1 * $pad );
- }
- }
- $des = new DesComponent();
- echo ($des->encrypt("19760519"));
- echo "<br />";
- //die($des->decrypt("zLVdpYUM0qw="));
- //die($des->decrypt("zLVdpYUM0qzEsNshEEI6Cg=="));
- $t2 =$des->decrypt("zLVdpYUM0qw=");
- echo $t2;
- echo "--";
- echo strlen($t2);
- echo is_utf8($t2);
- echo "<br />";
- $t3 = mb_convert_encoding($t2,"GB2312", "utf-8");
- echo $t3;
- echo "--";
- echo strlen($t3);
- echo is_utf8($t3);
- echo "<br />";
- $t1 =$des->decrypt("zLVdpYUM0qzEsNshEEI6Cg==");
- echo $t1;
- echo "--";
- echo strlen($t1);
- echo is_utf8($t1);
- echo "<br />";
- $t3 = mb_convert_encoding($t1, "utf-8","GB2312");
- echo $t3;
- echo "--";
- echo strlen($t3);
- echo is_utf8($t3);
- function is_utf8($string) {
- return preg_match('%^(?:
- [\x09\x0A\x0D\x20-\x7E] # ASCII
- | [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte
- | \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs
- | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
- | \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates
- | \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3
- | [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15
- | \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16
- )*$%xs', $string);
- }
- ?>
Java的加解密函数
- package ghj1976.Demo;
- /*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- import java.io.UnsupportedEncodingException;
- /**
- * Utilities for encoding and decoding the Base64 representation of
- * binary data. See RFCs <a
- * href="http://www.ietf.org/rfc/rfc2045.txt">2045</a> and <a
- * href="http://www.ietf.org/rfc/rfc3548.txt">3548</a>.
- */
- public class Base64 {
- /**
- * Default values for encoder/decoder flags.
- */
- public static final int DEFAULT = 0;
- /**
- * Encoder flag bit to omit the padding '=' characters at the end
- * of the output (if any).
- */
- public static final int NO_PADDING = 1;
- /**
- * Encoder flag bit to omit all line terminators (i.e., the output
- * will be on one long line).
- */
- public static final int NO_WRAP = 2;
- /**
- * Encoder flag bit to indicate lines should be terminated with a
- * CRLF pair instead of just an LF. Has no effect if {@code
- * NO_WRAP} is specified as well.
- */
- public static final int CRLF = 4;
- /**
- * Encoder/decoder flag bit to indicate using the "URL and
- * filename safe" variant of Base64 (see RFC 3548 section 4) where
- * {@code -} and {@code _} are used in place of {@code +} and
- * {@code /}.
- */
- public static final int URL_SAFE = 8;
- /**
- * Flag to pass to {@link Base64OutputStream} to indicate that it
- * should not close the output stream it is wrapping when it
- * itself is closed.
- */
- public static final int NO_CLOSE = 16;
- // --------------------------------------------------------
- // shared code
- // --------------------------------------------------------
- /* package */ static abstract class Coder {
- public byte[] output;
- public int op;
- /**
- * Encode/decode another block of input data. this.output is
- * provided by the caller, and must be big enough to hold all
- * the coded data. On exit, this.opwill be set to the length
- * of the coded data.
- *
- * @param finish true if this is the final call to process for
- * this object. Will finalize the coder state and
- * include any final bytes in the output.
- *
- * @return true if the input so far is good; false if some
- * error has been detected in the input stream..
- */
- public abstract boolean process(byte[] input, int offset, int len, boolean finish);
- /**
- * @return the maximum number of bytes a call to process()
- * could produce for the given number of input bytes. This may
- * be an overestimate.
- */
- public abstract int maxOutputSize(int len);
- }
- // --------------------------------------------------------
- // decoding
- // --------------------------------------------------------
- /**
- * Decode the Base64-encoded data in input and return the data in
- * a new byte array.
- *
- * <p>The padding '=' characters at the end are considered optional, but
- * if any are present, there must be the correct number of them.
- *
- * @param str the input String to decode, which is converted to
- * bytes using the default charset
- * @param flags controls certain features of the decoded output.
- * Pass {@code DEFAULT} to decode standard Base64.
- *
- * @throws IllegalArgumentException if the input contains
- * incorrect padding
- */
- public static byte[] decode(String str, int flags) {
- return decode(str.getBytes(), flags);
- }
- /**
- * Decode the Base64-encoded data in input and return the data in
- * a new byte array.
- *
- * <p>The padding '=' characters at the end are considered optional, but
- * if any are present, there must be the correct number of them.
- *
- * @param input the input array to decode
- * @param flags controls certain features of the decoded output.
- * Pass {@code DEFAULT} to decode standard Base64.
- *
- * @throws IllegalArgumentException if the input contains
- * incorrect padding
- */
- public static byte[] decode(byte[] input, int flags) {
- return decode(input, 0, input.length, flags);
- }
- /**
- * Decode the Base64-encoded data in input and return the data in
- * a new byte array.
- *
- * <p>The padding '=' characters at the end are considered optional, but
- * if any are present, there must be the correct number of them.
- *
- * @param input the data to decode
- * @param offset the position within the input array at which to start
- * @param len the number of bytes of input to decode
- * @param flags controls certain features of the decoded output.
- * Pass {@code DEFAULT} to decode standard Base64.
- *
- * @throws IllegalArgumentException if the input contains
- * incorrect padding
- */
- public static byte[] decode(byte[] input, int offset, int len, int flags) {
- // Allocate space for the most data the input could represent.
- // (It could contain less if it contains whitespace, etc.)
- Decoder decoder = new Decoder(flags, new byte[len*3/4]);
- if (!decoder.process(input, offset, len, true)) {
- throw new IllegalArgumentException("bad base-64");
- }
- // Maybe we got lucky and allocated exactly enough output space.
- if (decoder.op == decoder.output.length) {
- return decoder.output;
- }
- // Need to shorten the array, so allocate a new one of the
- // right size and copy.
- byte[] temp = new byte[decoder.op];
- System.arraycopy(decoder.output, 0, temp, 0, decoder.op);
- return temp;
- }
- /* package */ static class Decoder extends Coder {
- /**
- * Lookup table for turning bytes into their position in the
- * Base64 alphabet.
- */
- private static final int DECODE[] = {
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,
- 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -2, -1, -1,
- -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
- 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,
- -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
- 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- };
- /**
- * Decode lookup table for the "web safe" variant (RFC 3548
- * sec. 4) where - and _ replace + and /.
- */
- private static final int DECODE_WEBSAFE[] = {
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1,
- 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -2, -1, -1,
- -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
- 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, 63,
- -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
- 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- };
- /** Non-data values in the DECODE arrays. */
- private static final int SKIP = -1;
- private static final int EQUALS = -2;
- /**
- * States 0-3 are reading through the next input tuple.
- * State 4 is having read one '=' and expecting exactly
- * one more.
- * State 5 is expecting no more data or padding characters
- * in the input.
- * State 6 is the error state; an error has been detected
- * in the input and no future input can "fix" it.
- */
- private int state; // state number (0 to 6)
- private int value;
- final private int[] alphabet;
- public Decoder(int flags, byte[] output) {
- this.output = output;
- alphabet = ((flags & URL_SAFE) == 0) ? DECODE : DECODE_WEBSAFE;
- state = 0;
- value = 0;
- }
- /**
- * @return an overestimate for the number of bytes {@code
- * len} bytes could decode to.
- */
- public int maxOutputSize(int len) {
- return len * 3/4 + 10;
- }
- /**
- * Decode another block of input data.
- *
- * @return true if the state machine is still healthy. false if
- * bad base-64 data has been detected in the input stream.
- */
- public boolean process(byte[] input, int offset, int len, boolean finish) {
- if (this.state == 6) return false;
- int p = offset;
- len += offset;
- // Using local variables makes the decoder about 12%
- // faster than if we manipulate the member variables in
- // the loop. (Even alphabet makes a measurable
- // difference, which is somewhat surprising to me since
- // the member variable is final.)
- int state = this.state;
- int value = this.value;
- int op = 0;
- final byte[] output = this.output;
- final int[] alphabet = this.alphabet;
- while (p < len) {
- // Try the fast path: we're starting a new tuple and the
- // next four bytes of the input stream are all data
- // bytes. This corresponds to going through states
- // 0-1-2-3-0. We expect to use this method for most of
- // the data.
- //
- // If any of the next four bytes of input are non-data
- // (whitespace, etc.), value will end up negative. (All
- // the non-data values in decode are small negative
- // numbers, so shifting any of them up and or'ing them
- // together will result in a value with its top bit set.)
- //
- // You can remove this whole block and the output should
- // be the same, just slower.
- if (state == 0) {
- while (p+4 <= len &&
- (value = ((alphabet[input[p] & 0xff] << 18) |
- (alphabet[input[p+1] & 0xff] << 12) |
- (alphabet[input[p+2] & 0xff] << 6) |
- (alphabet[input[p+3] & 0xff]))) >= 0) {
- output[op+2] = (byte) value;
- output[op+1] = (byte) (value >> 8);
- output[op] = (byte) (value >> 16);
- op += 3;
- p += 4;
- }
- if (p >= len) break;
- }
- // The fast path isn't available -- either we've read a
- // partial tuple, or the next four input bytes aren't all
- // data, or whatever. Fall back to the slower state
- // machine implementation.
- int d = alphabet[input[p++] & 0xff];
- switch (state) {
- case 0:
- if (d >= 0) {
- value = d;
- ++state;
- } else if (d != SKIP) {
- this.state = 6;
- return false;
- }
- break;
- case 1:
- if (d >= 0) {
- value = (value << 6) | d;
- ++state;
- } else if (d != SKIP) {
- this.state = 6;
- return false;
- }
- break;
- case 2:
- if (d >= 0) {
- value = (value << 6) | d;
- ++state;
- } else if (d == EQUALS) {
- // Emit the last (partial) output tuple;
- // expect exactly one more padding character.
- output[op++] = (byte) (value >> 4);
- state = 4;
- } else if (d != SKIP) {
- this.state = 6;
- return false;
- }
- break;
- case 3:
- if (d >= 0) {
- // Emit the output triple and return to state 0.
- value = (value << 6) | d;
- output[op+2] = (byte) value;
- output[op+1] = (byte) (value >> 8);
- output[op] = (byte) (value >> 16);
- op += 3;
- state = 0;
- } else if (d == EQUALS) {
- // Emit the last (partial) output tuple;
- // expect no further data or padding characters.
- output[op+1] = (byte) (value >> 2);
- output[op] = (byte) (value >> 10);
- op += 2;
- state = 5;
- } else if (d != SKIP) {
- this.state = 6;
- return false;
- }
- break;
- case 4:
- if (d == EQUALS) {
- ++state;
- } else if (d != SKIP) {
- this.state = 6;
- return false;
- }
- break;
- case 5:
- if (d != SKIP) {
- this.state = 6;
- return false;
- }
- break;
- }
- }
- if (!finish) {
- // We're out of input, but a future call could provide
- // more.
- this.state = state;
- this.value = value;
- this.op = op;
- return true;
- }
- // Done reading input. Now figure out where we are left in
- // the state machine and finish up.
- switch (state) {
- case 0:
- // Output length is a multiple of three. Fine.
- break;
- case 1:
- // Read one extra input byte, which isn't enough to
- // make another output byte. Illegal.
- this.state = 6;
- return false;
- case 2:
- // Read two extra input bytes, enough to emit 1 more
- // output byte. Fine.
- output[op++] = (byte) (value >> 4);
- break;
- case 3:
- // Read three extra input bytes, enough to emit 2 more
- // output bytes. Fine.
- output[op++] = (byte) (value >> 10);
- output[op++] = (byte) (value >> 2);
- break;
- case 4:
- // Read one padding '=' when we expected 2. Illegal.
- this.state = 6;
- return false;
- case 5:
- // Read all the padding '='s we expected and no more.
- // Fine.
- break;
- }
- this.state = state;
- this.op = op;
- return true;
- }
- }
- // --------------------------------------------------------
- // encoding
- // --------------------------------------------------------
- /**
- * Base64-encode the given data and return a newly allocated
- * String with the result.
- *
- * @param input the data to encode
- * @param flags controls certain features of the encoded output.
- * Passing {@code DEFAULT} results in output that
- * adheres to RFC 2045.
- */
- public static String encodeToString(byte[] input, int flags) {
- try {
- return new String(encode(input, flags), "US-ASCII");
- } catch (UnsupportedEncodingException e) {
- // US-ASCII is guaranteed to be available.
- throw new AssertionError(e);
- }
- }
- /**
- * Base64-encode the given data and return a newly allocated
- * String with the result.
- *
- * @param input the data to encode
- * @param offset the position within the input array at which to
- * start
- * @param len the number of bytes of input to encode
- * @param flags controls certain features of the encoded output.
- * Passing {@code DEFAULT} results in output that
- * adheres to RFC 2045.
- */
- public static String encodeToString(byte[] input, int offset, int len, int flags) {
- try {
- return new String(encode(input, offset, len, flags), "US-ASCII");
- } catch (UnsupportedEncodingException e) {
- // US-ASCII is guaranteed to be available.
- throw new AssertionError(e);
- }
- }
- /**
- * Base64-encode the given data and return a newly allocated
- * byte[] with the result.
- *
- * @param input the data to encode
- * @param flags controls certain features of the encoded output.
- * Passing {@code DEFAULT} results in output that
- * adheres to RFC 2045.
- */
- public static byte[] encode(byte[] input, int flags) {
- return encode(input, 0, input.length, flags);
- }
- /**
- * Base64-encode the given data and return a newly allocated
- * byte[] with the result.
- *
- * @param input the data to encode
- * @param offset the position within the input array at which to
- * start
- * @param len the number of bytes of input to encode
- * @param flags controls certain features of the encoded output.
- * Passing {@code DEFAULT} results in output that
- * adheres to RFC 2045.
- */
- public static byte[] encode(byte[] input, int offset, int len, int flags) {
- Encoder encoder = new Encoder(flags, null);
- // Compute the exact length of the array we will produce.
- int output_len = len / 3 * 4;
- // Account for the tail of the data and the padding bytes, if any.
- if (encoder.do_padding) {
- if (len % 3 > 0) {
- output_len += 4;
- }
- } else {
- switch (len % 3) {
- case 0: break;
- case 1: output_len += 2; break;
- case 2: output_len += 3; break;
- }
- }
- // Account for the newlines, if any.
- if (encoder.do_newline && len > 0) {
- output_len += (((len-1) / (3 * Encoder.LINE_GROUPS)) + 1) *
- (encoder.do_cr ? 2 : 1);
- }
- encoder.output = new byte[output_len];
- encoder.process(input, offset, len, true);
- assert encoder.op == output_len;
- return encoder.output;
- }
- /* package */ static class Encoder extends Coder {
- /**
- * Emit a new line every this many output tuples. Corresponds to
- * a 76-character line length (the maximum allowable according to
- * <a href="http://www.ietf.org/rfc/rfc2045.txt">RFC 2045</a>).
- */
- public static final int LINE_GROUPS = 19;
- /**
- * Lookup table for turning Base64 alphabet positions (6 bits)
- * into output bytes.
- */
- private static final byte ENCODE[] = {
- 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
- 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
- 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
- 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/',
- };
- /**
- * Lookup table for turning Base64 alphabet positions (6 bits)
- * into output bytes.
- */
- private static final byte ENCODE_WEBSAFE[] = {
- 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
- 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
- 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
- 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '_',
- };
- final private byte[] tail;
- /* package */ int tailLen;
- private int count;
- final public boolean do_padding;
- final public boolean do_newline;
- final public boolean do_cr;
- final private byte[] alphabet;
- public Encoder(int flags, byte[] output) {
- this.output = output;
- do_padding = (flags & NO_PADDING) == 0;
- do_newline = (flags & NO_WRAP) == 0;
- do_cr = (flags & CRLF) != 0;
- alphabet = ((flags & URL_SAFE) == 0) ? ENCODE : ENCODE_WEBSAFE;
- tail = new byte[2];
- tailLen = 0;
- count = do_newline ? LINE_GROUPS : -1;
- }
- /**
- * @return an overestimate for the number of bytes {@code
- * len} bytes could encode to.
- */
- public int maxOutputSize(int len) {
- return len * 8/5 + 10;
- }
- public boolean process(byte[] input, int offset, int len, boolean finish) {
- // Using local variables makes the encoder about 9% faster.
- final byte[] alphabet = this.alphabet;
- final byte[] output = this.output;
- int op = 0;
- int count = this.count;
- int p = offset;
- len += offset;
- int v = -1;
- // First we need to concatenate the tail of the previous call
- // with any input bytes available now and see if we can empty
- // the tail.
- switch (tailLen) {
- case 0:
- // There was no tail.
- break;
- case 1:
- if (p+2 <= len) {
- // A 1-byte tail with at least 2 bytes of
- // input available now.
- v = ((tail[0] & 0xff) << 16) |
- ((input[p++] & 0xff) << 8) |
- (input[p++] & 0xff);
- tailLen = 0;
- };
- break;
- case 2:
- if (p+1 <= len) {
- // A 2-byte tail with at least 1 byte of input.
- v = ((tail[0] & 0xff) << 16) |
- ((tail[1] & 0xff) << 8) |
- (input[p++] & 0xff);
- tailLen = 0;
- }
- break;
- }
- if (v != -1) {
- output[op++] = alphabet[(v >> 18) & 0x3f];
- output[op++] = alphabet[(v >> 12) & 0x3f];
- output[op++] = alphabet[(v >> 6) & 0x3f];
- output[op++] = alphabet[v & 0x3f];
- if (--count == 0) {
- if (do_cr) output[op++] = '\r';
- output[op++] = '\n';
- count = LINE_GROUPS;
- }
- }
- // At this point either there is no tail, or there are fewer
- // than 3 bytes of input available.
- // The main loop, turning 3 input bytes into 4 output bytes on
- // each iteration.
- while (p+3 <= len) {
- v = ((input[p] & 0xff) << 16) |
- ((input[p+1] & 0xff) << 8) |
- (input[p+2] & 0xff);
- output[op] = alphabet[(v >> 18) & 0x3f];
- output[op+1] = alphabet[(v >> 12) & 0x3f];
- output[op+2] = alphabet[(v >> 6) & 0x3f];
- output[op+3] = alphabet[v & 0x3f];
- p += 3;
- op += 4;
- if (--count == 0) {
- if (do_cr) output[op++] = '\r';
- output[op++] = '\n';
- count = LINE_GROUPS;
- }
- }
- if (finish) {
- // Finish up the tail of the input. Note that we need to
- // consume any bytes in tail before any bytes
- // remaining in input; there should be at most two bytes
- // total.
- if (p-tailLen == len-1) {
- int t = 0;
- v = ((tailLen > 0 ? tail[t++] : input[p++]) & 0xff) << 4;
- tailLen -= t;
- output[op++] = alphabet[(v >> 6) & 0x3f];
- output[op++] = alphabet[v & 0x3f];
- if (do_padding) {
- output[op++] = '=';
- output[op++] = '=';
- }
- if (do_newline) {
- if (do_cr) output[op++] = '\r';
- output[op++] = '\n';
- }
- } else if (p-tailLen == len-2) {
- int t = 0;
- v = (((tailLen > 1 ? tail[t++] : input[p++]) & 0xff) << 10) |
- (((tailLen > 0 ? tail[t++] : input[p++]) & 0xff) << 2);
- tailLen -= t;
- output[op++] = alphabet[(v >> 12) & 0x3f];
- output[op++] = alphabet[(v >> 6) & 0x3f];
- output[op++] = alphabet[v & 0x3f];
- if (do_padding) {
- output[op++] = '=';
- }
- if (do_newline) {
- if (do_cr) output[op++] = '\r';
- output[op++] = '\n';
- }
- } else if (do_newline && op > 0 && count != LINE_GROUPS) {
- if (do_cr) output[op++] = '\r';
- output[op++] = '\n';
- }
- assert tailLen == 0;
- assert p == len;
- } else {
- // Save the leftovers in tail to be consumed on the next
- // call to encodeInternal.
- if (p == len-1) {
- tail[tailLen++] = input[p];
- } else if (p == len-2) {
- tail[tailLen++] = input[p];
- tail[tailLen++] = input[p+1];
- }
- }
- this.op = op;
- this.count = count;
- return true;
- }
- }
- private Base64() { } // don't instantiate
- }
- package ghj1976.Demo;
- import javax.crypto.Cipher;
- import javax.crypto.SecretKey;
- import javax.crypto.SecretKeyFactory;
- import javax.crypto.spec.DESKeySpec;
- import javax.crypto.spec.IvParameterSpec;
- public class DES {
- private static String DESKey = "12345678"; // 字节数必须是8的倍数
- private static byte[] iv1 = {(byte)0x12, (byte)0x34, (byte)0x56, (byte)0x78, (byte)0x90, (byte)0xAB, (byte)0xCD, (byte)0xEF};
- public static void main(String[] args) {
- System.out.print("xyz");
- DES des = new DES();
- System.out.print(des.encrypt("19760519"));
- }
- public byte[] desEncrypt(byte[] plainText) throws Exception
- {
- // SecureRandom sr = new SecureRandom();
- // sr.setSeed(iv);
- // IvParameterSpec iv = new IvParameterSpec(key.getBytes("UTF-8"));
- IvParameterSpec iv = new IvParameterSpec(iv1);
- DESKeySpec dks = new DESKeySpec(DESKey.getBytes());
- SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
- SecretKey key = keyFactory.generateSecret(dks);
- Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
- cipher.init(Cipher.ENCRYPT_MODE, key, iv);
- byte data[] = plainText;
- byte encryptedData[] = cipher.doFinal(data);
- return encryptedData;
- }
- public String encrypt(String input)
- {
- String result = "input";
- try {
- result = base64Encode(desEncrypt(input.getBytes()));
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- return result;
- }
- public String base64Encode(byte[] s)
- {
- if (s == null)
- return null;
- return Base64.encodeToString(s, Base64.DEFAULT);
- }
- }
Object c 的加解密函数
- //
- // Utility.h
- // TheDealersForum
- //
- // Created by Hailong Zhang on 5/3/11.
- // Copyright 2011 Personal. All rights reserved.
- //
- #import <Foundation/Foundation.h>
- #import <CommonCrypto/CommonDigest.h>
- #import <CommonCrypto/CommonCryptor.h>
- @interface Utility : NSObject {
- }
- + (NSString *) udid;
- + (NSString *) md5:(NSString *)str;
- + (NSString *) doCipher:(NSString *)sTextIn key:(NSString *)sKey context:(CCOperation)encryptOrDecrypt;
- + (NSString *) encryptStr:(NSString *) str;
- + (NSString *) decryptStr:(NSString *) str;
- #pragma mark Based64
- + (NSString *) encodeBase64WithString:(NSString *)strData;
- + (NSString *) encodeBase64WithData:(NSData *)objData;
- + (NSData *) decodeBase64WithString:(NSString *)strBase64;
- @end
- //
- // Utility.m
- // TheDealersForum
- //
- // Created by Hailong Zhang on 5/3/11.
- // Copyright 2011 Personal. All rights reserved.
- //
- #import "Utility.h"
- static NSString *_key = @"12345678";
- static const char _base64EncodingTable[64] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
- static const short _base64DecodingTable[256] = {
- -2, -2, -2, -2, -2, -2, -2, -2, -2, -1, -1, -2, -1, -1, -2, -2,
- -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
- -1, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, 62, -2, -2, -2, 63,
- 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -2, -2, -2, -2, -2, -2,
- -2, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
- 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -2, -2, -2, -2, -2,
- -2, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
- 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -2, -2, -2, -2, -2,
- -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
- -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
- -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
- -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
- -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
- -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
- -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
- -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2
- };
- @implementation Utility
- + (NSString *) udid
- {
- return [Utility encryptStr:[[UIDevice currentDevice] uniqueIdentifier]];
- }
- + (NSString *) md5:(NSString *)str
- {
- const char *cStr = [str UTF8String];
- unsigned char result[CC_MD5_DIGEST_LENGTH];
- CC_MD5( cStr, strlen(cStr), result );
- return [NSString
- stringWithFormat: @"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
- result[0], result[1],
- result[2], result[3],
- result[4], result[5],
- result[6], result[7],
- result[8], result[9],
- result[10], result[11],
- result[12], result[13],
- result[14], result[15]
- ];
- }
- + (NSString *) encryptStr:(NSString *) str
- {
- return [Utility doCipher:str key:_key context:kCCEncrypt];
- }
- + (NSString *) decryptStr:(NSString *) str
- {
- return [Utility doCipher:str key:_key context:kCCDecrypt];
- }
- + (NSString *)doCipher:(NSString *)sTextIn key:(NSString *)sKey
- context:(CCOperation)encryptOrDecrypt {
- NSStringEncoding EnC = NSUTF8StringEncoding;
- NSMutableData * dTextIn;
- if (encryptOrDecrypt == kCCDecrypt) {
- dTextIn = [[Utility decodeBase64WithString:sTextIn] mutableCopy];
- }
- else{
- dTextIn = [[sTextIn dataUsingEncoding: EnC] mutableCopy];
- }
- NSMutableData * dKey = [[sKey dataUsingEncoding:EnC] mutableCopy];
- [dKey setLength:kCCBlockSizeDES];
- uint8_t *bufferPtr1 = NULL;
- size_t bufferPtrSize1 = 0;
- size_t movedBytes1 = 0;
- //uint8_t iv[kCCBlockSizeDES];
- //memset((void *) iv, 0x0, (size_t) sizeof(iv));
- Byte iv[] = {0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF};
- bufferPtrSize1 = ([sTextIn length] + kCCKeySizeDES) & ~(kCCKeySizeDES -1);
- bufferPtr1 = malloc(bufferPtrSize1 * sizeof(uint8_t));
- memset((void *)bufferPtr1, 0x00, bufferPtrSize1);
- CCCrypt(encryptOrDecrypt, // CCOperation op
- kCCAlgorithmDES, // CCAlgorithm alg
- kCCOptionPKCS7Padding, // CCOptions options
- [dKey bytes], // const void *key
- [dKey length], // size_t keyLength
- iv, // const void *iv
- [dTextIn bytes], // const void *dataIn
- [dTextIn length], // size_t dataInLength
- (void *)bufferPtr1, // void *dataOut
- bufferPtrSize1, // size_t dataOutAvailable
- &movedBytes1); // size_t *dataOutMoved
- NSString * sResult;
- if (encryptOrDecrypt == kCCDecrypt){
- sResult = [[[ NSString alloc] initWithData:[NSData dataWithBytes:bufferPtr1
- length:movedBytes1] encoding:EnC] autorelease];
- }
- else {
- NSData *dResult = [NSData dataWithBytes:bufferPtr1 length:movedBytes1];
- sResult = [Utility encodeBase64WithData:dResult];
- }
- return sResult;
- }
- + (NSString *)encodeBase64WithString:(NSString *)strData {
- return [Utility encodeBase64WithData:[strData dataUsingEncoding:NSUTF8StringEncoding]];
- }
- + (NSString *)encodeBase64WithData:(NSData *)objData {
- const unsigned char * objRawData = [objData bytes];
- char * objPointer;
- char * strResult;
- // Get the Raw Data length and ensure we actually have data
- int intLength = [objData length];
- if (intLength == 0) return nil;
- // Setup the String-based Result placeholder and pointer within that placeholder
- strResult = (char *)calloc(((intLength + 2) / 3) * 4, sizeof(char));
- objPointer = strResult;
- // Iterate through everything
- while (intLength > 2) { // keep going until we have less than 24 bits
- *objPointer++ = _base64EncodingTable[objRawData[0] >> 2];
- *objPointer++ = _base64EncodingTable[((objRawData[0] & 0x03) << 4) + (objRawData[1] >> 4)];
- *objPointer++ = _base64EncodingTable[((objRawData[1] & 0x0f) << 2) + (objRawData[2] >> 6)];
- *objPointer++ = _base64EncodingTable[objRawData[2] & 0x3f];
- // we just handled 3 octets (24 bits) of data
- objRawData += 3;
- intLength -= 3;
- }
- // now deal with the tail end of things
- if (intLength != 0) {
- *objPointer++ = _base64EncodingTable[objRawData[0] >> 2];
- if (intLength > 1) {
- *objPointer++ = _base64EncodingTable[((objRawData[0] & 0x03) << 4) + (objRawData[1] >> 4)];
- *objPointer++ = _base64EncodingTable[(objRawData[1] & 0x0f) << 2];
- *objPointer++ = '=';
- } else {
- *objPointer++ = _base64EncodingTable[(objRawData[0] & 0x03) << 4];
- *objPointer++ = '=';
- *objPointer++ = '=';
- }
- }
- // Terminate the string-based result
- *objPointer = '\0';
- // Return the results as an NSString object
- return [NSString stringWithCString:strResult encoding:NSASCIIStringEncoding];
- }
- + (NSData *)decodeBase64WithString:(NSString *)strBase64 {
- const char * objPointer = [strBase64 cStringUsingEncoding:NSASCIIStringEncoding];
- int intLength = strlen(objPointer);
- int intCurrent;
- int i = 0, j = 0, k;
- unsigned char * objResult;
- objResult = calloc(intLength, sizeof(char));
- // Run through the whole string, converting as we go
- while ( ((intCurrent = *objPointer++) != '\0') && (intLength-- > 0) ) {
- if (intCurrent == '=') {
- if (*objPointer != '=' && ((i % 4) == 1)) {// || (intLength > 0)) {
- // the padding character is invalid at this point -- so this entire string is invalid
- free(objResult);
- return nil;
- }
- continue;
- }
- intCurrent = _base64DecodingTable[intCurrent];
- if (intCurrent == -1) {
- // we're at a whitespace -- simply skip over
- continue;
- } else if (intCurrent == -2) {
- // we're at an invalid character
- free(objResult);
- return nil;
- }
- switch (i % 4) {
- case 0:
- objResult[j] = intCurrent << 2;
- break;
- case 1:
- objResult[j++] |= intCurrent >> 4;
- objResult[j] = (intCurrent & 0x0f) << 4;
- break;
- case 2:
- objResult[j++] |= intCurrent >>2;
- objResult[j] = (intCurrent & 0x03) << 6;
- break;
- case 3:
- objResult[j++] |= intCurrent;
- break;
- }
- i++;
- }
- // mop things up if we ended on a boundary
- k = j;
- if (intCurrent == '=') {
- switch (i % 4) {
- case 1:
- // Invalid state
- free(objResult);
- return nil;
- case 2:
- k++;
- // flow through
- case 3:
- objResult[k] = 0;
- }
- }
- // Cleanup and setup the return NSData
- NSData * objData = [[[NSData alloc] initWithBytes:objResult length:j] autorelease];
- free(objResult);
- return objData;
- }
- @end
DES加密和解密PHP,Java,ObjectC统一的方法的更多相关文章
- 【Java】通过DES加密和解密工具,对字符串进行加密和解密操作
分享一个非常不错的字符串加密和解密的程序. 可以指定不同的密钥对同一字符串进行不同的加密操作,增强加密性能. Java代码如下: package com.app; import java.securi ...
- Java Base64加密、解密原理Java代码
Java Base64加密.解密原理Java代码 转自:http://blog.csdn.net/songylwq/article/details/7578905 Base64是什么: Base64是 ...
- 一、DES加密和解密
一.DES加密和解密 原文:http://www.jb51.net/article/51879.htm 还有其他文章 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1 ...
- DES加密与解密在GET请求时解密失败的问题
DES加密与解密在GET请求时解密失败的问题 在数据进行加密后传递会更安全,但可能有个问题:就是Url编码问题,如果不对Url进行编码直接加密,那么在解密时,如果字符串存在 “+”,这种特殊符号,在解 ...
- java实现DES加密与解密,md5加密
很多时候要对秘要进行持久化加密,此时的加密采用md5.采用对称加密的时候就采用DES方法了 import java.io.IOException; import java.security.Messa ...
- Java DES 加密和解密源码(转)
原文地址:http://www.oschina.net/code/snippet_727646_18383 Java密码学结构设计遵循两个原则: 1) 算法的独立性和可靠性. 2) 实现的独立性和相互 ...
- .Net使用DES加密,.Net和java分别解密,并正则匹配替换加密密码为明文
在VS中用WindowsApplication做一个exe程序,用来给数据库密码加密,加密代码如下 private void generateBtn_Click(object sender, Even ...
- PHP 识别 java 8位 des 加密和 解密方式
代码及使用说明: <?php /** *PHP 识别 java 8位密钥的加密和解密方式 *@desc 加密方式 通用 */ class DES { var $key; var $iv; //偏 ...
- BASE64,MD5,SHA,HMAC加密與解密算法(java)
package com.ice.webos.util.security; import java.io.UnsupportedEncodingException; import java.math.B ...
随机推荐
- C#读取excel等表格常用方法
0. 利用NPOI. 请查阅此插件的相关文档. 1.方法一:采用OleDB读取EXCEL文件: 把EXCEL文件当做一个数据源来进行数据的读取操作,实例如下: 1 2 3 4 5 6 7 8 9 10 ...
- ZOJ 3734 LIKE vs CANDLE
题目意思:(13年长沙站的一道水DP,本人也去了,当时太水笔) 说俩个人竞争选票,每个人可以随机选择支持谁.每个人带有权重不同. 现在已经结束了投票阶段,你一个骇客 支持LIKE 你写了一个软件可以 ...
- ps命令用法详解(转)
ps p 22763 -L -o pcpu,pid,tid,time,tname,cmd,pmem,rss --sort rss 按rss排序 ps p 26653 -L -o pcpu,tid ...
- UVA434 - Matty's Blocks
option=com_onlinejudge&Itemid=8&page=show_problem&category=457&problem=375&mosms ...
- 如何插上U盘 自动复制内容
U盘插入自动复制,有效对付那些不肯给PPT的老师,还有一定几率拿到期末考试卷子···有图有真相!业界良心的好东西!!现在看还来得及!!! 代码优化了一下,把不是很重要的都删掉了,这次使用时看不出任何现 ...
- 【C语言探索之旅】 第二部分第九课: 实战"悬挂小人"游戏 答案
内容简介 1.课程大纲 2.第二部分第九课: 实战"悬挂小人"游戏 答案 3.第二部分第十课预告: 安全的文本输入 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题, ...
- redis源代码解读之内存管理————zmalloc文件
本文章主要记录本人在看redis源代码的一些理解和想法.由于功力有限,肯定会出现故障,所以.希望高手给出指正. 第一篇就是内存相关的介绍.由于我喜欢先看一些组件的东西,再看总体的流程. 先上一下代码吧 ...
- RunJS推荐用于个人使用(使用方便JS、css实时预览、编辑、管理等功能)
RunJS,在线编写.展示html.js.css代码,拥有实时预览.分享.Fork.代码高亮.自己主动完毕等多项特性,提供文件上传.多种登录方式. 地址:http://runjs.cn/ waterm ...
- yate.conf
但档案.粘贴下面的例子.不解释!除去非常灵活!只保留sip电话! [general] ; General settings for the operation of Yate ; modload: b ...
- C# WinForm 拖动无边框窗体 改变无边框窗体尺寸
经常遇到这种情况.窗体的边框去掉了.然后种种问题就出来了:不能拖动.不能改变窗体大小.不能......当然.肯定有解决方案滴*^_^*今天的目标就是:可以直接拖动没有边框的窗体.可以直接拉拽窗体改变其 ...