Guest User

MD5 Windows Phone / Silverlight

a guest
Sep 25th, 2013
452
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 20.40 KB | None | 0 0
  1. // Source http://thomasnigro.fr/blog/2013/04/05/convertir-un-string-en-md5-sous-windows-phone/
  2. // Just See too: http://codeit.pro
  3. using System;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.IO;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10.  
  11. namespace ''NOM_DU_PROJET''.Classes
  12. {
  13.     public class MD5CryptoServiceProvider : MD5
  14.     {
  15.         public MD5CryptoServiceProvider()
  16.             : base()
  17.         {
  18.         }
  19.     }
  20.  
  21.     public class MD5 : IDisposable
  22.     {
  23.         static public MD5 Create(string hashName)
  24.         {
  25.             if (hashName == "MD5")
  26.                 return new MD5();
  27.             else
  28.                 throw new NotSupportedException();
  29.         }
  30.  
  31.         static public string GetMd5String(String source)
  32.         {
  33.             MD5 md = MD5CryptoServiceProvider.Create();
  34.             byte[] hash;
  35.  
  36.             //Create a new instance of ASCIIEncoding to
  37.             //convert the string into an array of Unicode bytes.
  38.             UTF8Encoding enc = new UTF8Encoding();
  39.             //            ASCIIEncoding enc = new ASCIIEncoding();
  40.  
  41.             //Convert the string into an array of bytes.
  42.             byte[] buffer = enc.GetBytes(source);
  43.  
  44.             //Create the hash value from the array of bytes.
  45.             hash = md.ComputeHash(buffer);
  46.  
  47.             StringBuilder sb = new StringBuilder();
  48.             foreach (byte b in hash)
  49.                 sb.Append(b.ToString("x2"));
  50.             return sb.ToString();
  51.         }
  52.  
  53.         static public MD5 Create()
  54.         {
  55.             return new MD5();
  56.         }
  57.  
  58.         #region base implementation of the MD5
  59.         #region constants
  60.         private const byte S11 = 7;
  61.         private const byte S12 = 12;
  62.         private const byte S13 = 17;
  63.         private const byte S14 = 22;
  64.         private const byte S21 = 5;
  65.         private const byte S22 = 9;
  66.         private const byte S23 = 14;
  67.         private const byte S24 = 20;
  68.         private const byte S31 = 4;
  69.         private const byte S32 = 11;
  70.         private const byte S33 = 16;
  71.         private const byte S34 = 23;
  72.         private const byte S41 = 6;
  73.         private const byte S42 = 10;
  74.         private const byte S43 = 15;
  75.         private const byte S44 = 21;
  76.         static private byte[] PADDING = new byte[] {
  77.               0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  78.               0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  79.               0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  80.              };
  81.         #endregion
  82.  
  83.         #region F, G, H and I are basic MD5 functions.
  84.         static private uint F(uint x, uint y, uint z)
  85.         {
  86.             return (((x) & (y)) | ((~x) & (z)));
  87.         }
  88.         static private uint G(uint x, uint y, uint z)
  89.         {
  90.             return (((x) & (z)) | ((y) & (~z)));
  91.         }
  92.         static private uint H(uint x, uint y, uint z)
  93.         {
  94.             return ((x) ^ (y) ^ (z));
  95.         }
  96.         static private uint I(uint x, uint y, uint z)
  97.         {
  98.             return ((y) ^ ((x) | (~z)));
  99.         }
  100.         #endregion
  101.  
  102.         #region rotates x left n bits.
  103.         ///
  104.         /// rotates x left n bits.
  105.         ///
  106.         ///
  107.         ///
  108.         ///
  109.         static private uint ROTATE_LEFT(uint x, byte n)
  110.         {
  111.             return (((x) << (n)) | ((x) >> (32 - (n))));
  112.         }
  113.         #endregion
  114.  
  115.         #region FF, GG, HH, and II transformations
  116.         /// FF, GG, HH, and II transformations
  117.         /// for rounds 1, 2, 3, and 4.
  118.         /// Rotation is separate from addition to prevent recomputation.
  119.         static private void FF(ref uint a, uint b, uint c, uint d, uint x, byte s, uint ac)
  120.         {
  121.             (a) += F((b), (c), (d)) + (x) + (uint)(ac);
  122.             (a) = ROTATE_LEFT((a), (s));
  123.             (a) += (b);
  124.         }
  125.         static private void GG(ref uint a, uint b, uint c, uint d, uint x, byte s, uint ac)
  126.         {
  127.             (a) += G((b), (c), (d)) + (x) + (uint)(ac);
  128.             (a) = ROTATE_LEFT((a), (s));
  129.             (a) += (b);
  130.         }
  131.         static private void HH(ref uint a, uint b, uint c, uint d, uint x, byte s, uint ac)
  132.         {
  133.             (a) += H((b), (c), (d)) + (x) + (uint)(ac);
  134.             (a) = ROTATE_LEFT((a), (s));
  135.             (a) += (b);
  136.         }
  137.         static private void II(ref uint a, uint b, uint c, uint d, uint x, byte s, uint ac)
  138.         {
  139.             (a) += I((b), (c), (d)) + (x) + (uint)(ac);
  140.             (a) = ROTATE_LEFT((a), (s));
  141.             (a) += (b);
  142.         }
  143.         #endregion
  144.  
  145.         #region context info
  146.         ///
  147.         /// state (ABCD)
  148.         ///
  149.         uint[] state = new uint[4];
  150.  
  151.         ///
  152.         /// number of bits, modulo 2^64 (lsb first)
  153.         ///
  154.         uint[] count = new uint[2];
  155.  
  156.         ///
  157.         /// input buffer
  158.         ///
  159.         byte[] buffer = new byte[64];
  160.         #endregion
  161.  
  162.         internal MD5()
  163.         {
  164.             Initialize();
  165.         }
  166.  
  167.         ///
  168.         /// MD5 initialization. Begins an MD5 operation, writing a new context.
  169.         ///
  170.         ///
  171.         /// The RFC named it "MD5Init"
  172.         ///
  173.         public virtual void Initialize()
  174.         {
  175.             count[0] = count[1] = 0;
  176.  
  177.             // Load magic initialization constants.
  178.             state[0] = 0x67452301;
  179.             state[1] = 0xefcdab89;
  180.             state[2] = 0x98badcfe;
  181.             state[3] = 0x10325476;
  182.         }
  183.  
  184.         ///
  185.         /// MD5 block update operation. Continues an MD5 message-digest
  186.         /// operation, processing another message block, and updating the
  187.         /// context.
  188.         ///
  189.         ///
  190.         ///
  191.         ///
  192.         /// The RFC Named it MD5Update
  193.         protected virtual void HashCore(byte[] input, int offset, int count)
  194.         {
  195.             int i;
  196.             int index;
  197.             int partLen;
  198.  
  199.             // Compute number of bytes mod 64
  200.             index = (int)((this.count[0] >> 3) & 0x3F);
  201.  
  202.             // Update number of bits
  203.             if ((this.count[0] += (uint)((uint)count << 3)) < ((uint)count << 3))
  204.                 this.count[1]++;
  205.             this.count[1] += ((uint)count >> 29);
  206.  
  207.             partLen = 64 - index;
  208.  
  209.             // Transform as many times as possible.
  210.             if (count >= partLen)
  211.             {
  212.                 Buffer.BlockCopy(input, offset, this.buffer, index, partLen);
  213.                 Transform(this.buffer, 0);
  214.  
  215.                 for (i = partLen; i + 63 < count; i += 64)
  216.                     Transform(input, offset + i);
  217.  
  218.                 index = 0;
  219.             }
  220.             else
  221.                 i = 0;
  222.  
  223.             // Buffer remaining input
  224.             Buffer.BlockCopy(input, offset + i, this.buffer, index, count - i);
  225.         }
  226.  
  227.         ///
  228.         /// MD5 finalization. Ends an MD5 message-digest operation, writing the
  229.         /// the message digest and zeroizing the context.
  230.         ///
  231.         /// message digest
  232.         /// The RFC named it MD5Final
  233.         protected virtual byte[] HashFinal()
  234.         {
  235.             byte[] digest = new byte[16];
  236.             byte[] bits = new byte[8];
  237.             int index, padLen;
  238.  
  239.             // Save number of bits
  240.             Encode(bits, 0, this.count, 0, 8);
  241.  
  242.             // Pad out to 56 mod 64.
  243.             index = (int)((uint)(this.count[0] >> 3) & 0x3f);
  244.             padLen = (index < 56) ? (56 - index) : (120 - index);
  245.             HashCore(PADDING, 0, padLen);
  246.  
  247.             // Append length (before padding)
  248.             HashCore(bits, 0, 8);
  249.  
  250.             // Store state in digest
  251.             Encode(digest, 0, state, 0, 16);
  252.  
  253.             // Zeroize sensitive information.
  254.             count[0] = count[1] = 0;
  255.             state[0] = 0;
  256.             state[1] = 0;
  257.             state[2] = 0;
  258.             state[3] = 0;
  259.  
  260.             // initialize again, to be ready to use
  261.             Initialize();
  262.  
  263.             return digest;
  264.         }
  265.  
  266.         ///
  267.         /// MD5 basic transformation. Transforms state based on 64 bytes block.
  268.         ///
  269.         ///
  270.         ///
  271.         private void Transform(byte[] block, int offset)
  272.         {
  273.             uint a = state[0], b = state[1], c = state[2], d = state[3];
  274.             uint[] x = new uint[16];
  275.             Decode(x, 0, block, offset, 64);
  276.  
  277.             // Round 1
  278.             FF(ref a, b, c, d, x[0], S11, 0xd76aa478); /* 1 */
  279.             FF(ref d, a, b, c, x[1], S12, 0xe8c7b756); /* 2 */
  280.             FF(ref c, d, a, b, x[2], S13, 0x242070db); /* 3 */
  281.             FF(ref b, c, d, a, x[3], S14, 0xc1bdceee); /* 4 */
  282.             FF(ref a, b, c, d, x[4], S11, 0xf57c0faf); /* 5 */
  283.             FF(ref d, a, b, c, x[5], S12, 0x4787c62a); /* 6 */
  284.             FF(ref c, d, a, b, x[6], S13, 0xa8304613); /* 7 */
  285.             FF(ref b, c, d, a, x[7], S14, 0xfd469501); /* 8 */
  286.             FF(ref a, b, c, d, x[8], S11, 0x698098d8); /* 9 */
  287.             FF(ref d, a, b, c, x[9], S12, 0x8b44f7af); /* 10 */
  288.             FF(ref c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */
  289.             FF(ref b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */
  290.             FF(ref a, b, c, d, x[12], S11, 0x6b901122); /* 13 */
  291.             FF(ref d, a, b, c, x[13], S12, 0xfd987193); /* 14 */
  292.             FF(ref c, d, a, b, x[14], S13, 0xa679438e); /* 15 */
  293.             FF(ref b, c, d, a, x[15], S14, 0x49b40821); /* 16 */
  294.  
  295.             // Round 2
  296.             GG(ref a, b, c, d, x[1], S21, 0xf61e2562); /* 17 */
  297.             GG(ref d, a, b, c, x[6], S22, 0xc040b340); /* 18 */
  298.             GG(ref c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */
  299.             GG(ref b, c, d, a, x[0], S24, 0xe9b6c7aa); /* 20 */
  300.             GG(ref a, b, c, d, x[5], S21, 0xd62f105d); /* 21 */
  301.             GG(ref d, a, b, c, x[10], S22, 0x2441453); /* 22 */
  302.             GG(ref c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */
  303.             GG(ref b, c, d, a, x[4], S24, 0xe7d3fbc8); /* 24 */
  304.             GG(ref a, b, c, d, x[9], S21, 0x21e1cde6); /* 25 */
  305.             GG(ref d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */
  306.             GG(ref c, d, a, b, x[3], S23, 0xf4d50d87); /* 27 */
  307.             GG(ref b, c, d, a, x[8], S24, 0x455a14ed); /* 28 */
  308.             GG(ref a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */
  309.             GG(ref d, a, b, c, x[2], S22, 0xfcefa3f8); /* 30 */
  310.             GG(ref c, d, a, b, x[7], S23, 0x676f02d9); /* 31 */
  311.             GG(ref b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */
  312.  
  313.             // Round 3
  314.             HH(ref a, b, c, d, x[5], S31, 0xfffa3942); /* 33 */
  315.             HH(ref d, a, b, c, x[8], S32, 0x8771f681); /* 34 */
  316.             HH(ref c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */
  317.             HH(ref b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */
  318.             HH(ref a, b, c, d, x[1], S31, 0xa4beea44); /* 37 */
  319.             HH(ref d, a, b, c, x[4], S32, 0x4bdecfa9); /* 38 */
  320.             HH(ref c, d, a, b, x[7], S33, 0xf6bb4b60); /* 39 */
  321.             HH(ref b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */
  322.             HH(ref a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */
  323.             HH(ref d, a, b, c, x[0], S32, 0xeaa127fa); /* 42 */
  324.             HH(ref c, d, a, b, x[3], S33, 0xd4ef3085); /* 43 */
  325.             HH(ref b, c, d, a, x[6], S34, 0x4881d05); /* 44 */
  326.             HH(ref a, b, c, d, x[9], S31, 0xd9d4d039); /* 45 */
  327.             HH(ref d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */
  328.             HH(ref c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */
  329.             HH(ref b, c, d, a, x[2], S34, 0xc4ac5665); /* 48 */
  330.  
  331.             // Round 4
  332.             II(ref a, b, c, d, x[0], S41, 0xf4292244); /* 49 */
  333.             II(ref d, a, b, c, x[7], S42, 0x432aff97); /* 50 */
  334.             II(ref c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */
  335.             II(ref b, c, d, a, x[5], S44, 0xfc93a039); /* 52 */
  336.             II(ref a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */
  337.             II(ref d, a, b, c, x[3], S42, 0x8f0ccc92); /* 54 */
  338.             II(ref c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */
  339.             II(ref b, c, d, a, x[1], S44, 0x85845dd1); /* 56 */
  340.             II(ref a, b, c, d, x[8], S41, 0x6fa87e4f); /* 57 */
  341.             II(ref d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */
  342.             II(ref c, d, a, b, x[6], S43, 0xa3014314); /* 59 */
  343.             II(ref b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */
  344.             II(ref a, b, c, d, x[4], S41, 0xf7537e82); /* 61 */
  345.             II(ref d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */
  346.             II(ref c, d, a, b, x[2], S43, 0x2ad7d2bb); /* 63 */
  347.             II(ref b, c, d, a, x[9], S44, 0xeb86d391); /* 64 */
  348.  
  349.             state[0] += a;
  350.             state[1] += b;
  351.             state[2] += c;
  352.             state[3] += d;
  353.  
  354.             // Zeroize sensitive information.
  355.             for (int i = 0; i < x.Length; i++)
  356.                 x[i] = 0;
  357.         }
  358.  
  359.         ///
  360.         /// Encodes input (uint) into output (byte). Assumes len is
  361.         ///  multiple of 4.
  362.         ///
  363.         ///
  364.         ///
  365.         ///
  366.         ///
  367.         ///
  368.         private static void Encode(byte[] output, int outputOffset, uint[] input, int inputOffset, int count)
  369.         {
  370.             int i, j;
  371.             int end = outputOffset + count;
  372.             for (i = inputOffset, j = outputOffset; j < end; i++, j += 4)
  373.             {
  374.                 output[j] = (byte)(input[i] & 0xff);
  375.                 output[j + 1] = (byte)((input[i] >> 8) & 0xff);
  376.                 output[j + 2] = (byte)((input[i] >> 16) & 0xff);
  377.                 output[j + 3] = (byte)((input[i] >> 24) & 0xff);
  378.             }
  379.         }
  380.  
  381.         ///
  382.         /// Decodes input (byte) into output (uint). Assumes len is
  383.         /// a multiple of 4.
  384.         ///
  385.         ///
  386.         ///
  387.         ///
  388.         ///
  389.         ///
  390.         static private void Decode(uint[] output, int outputOffset, byte[] input, int inputOffset, int count)
  391.         {
  392.             int i, j;
  393.             int end = inputOffset + count;
  394.             for (i = outputOffset, j = inputOffset; j < end; i++, j += 4)
  395.                 output[i] = ((uint)input[j]) | (((uint)input[j + 1]) << 8) | (((uint)input[j + 2]) << 16) | (((uint)input[j + 3]) << 24);
  396.         }
  397.         #endregion
  398.  
  399.         #region expose the same interface as the regular MD5 object
  400.  
  401.         protected byte[] HashValue;
  402.         protected int State;
  403.         public virtual bool CanReuseTransform
  404.         {
  405.             get
  406.             {
  407.                 return true;
  408.             }
  409.         }
  410.  
  411.         public virtual bool CanTransformMultipleBlocks
  412.         {
  413.             get
  414.             {
  415.                 return true;
  416.             }
  417.         }
  418.         public virtual byte[] Hash
  419.         {
  420.             get
  421.             {
  422.                 if (this.State != 0)
  423.                     throw new InvalidOperationException();
  424.                 return (byte[])HashValue.Clone();
  425.             }
  426.         }
  427.         public virtual int HashSize
  428.         {
  429.             get
  430.             {
  431.                 return HashSizeValue;
  432.             }
  433.         }
  434.         protected int HashSizeValue = 128;
  435.  
  436.         public virtual int InputBlockSize
  437.         {
  438.             get
  439.             {
  440.                 return 1;
  441.             }
  442.         }
  443.         public virtual int OutputBlockSize
  444.         {
  445.             get
  446.             {
  447.                 return 1;
  448.             }
  449.         }
  450.  
  451.         public void Clear()
  452.         {
  453.             Dispose(true);
  454.         }
  455.  
  456.         public byte[] ComputeHash(byte[] buffer)
  457.         {
  458.             return ComputeHash(buffer, 0, buffer.Length);
  459.         }
  460.         public byte[] ComputeHash(byte[] buffer, int offset, int count)
  461.         {
  462.             Initialize();
  463.             HashCore(buffer, offset, count);
  464.             HashValue = HashFinal();
  465.             return (byte[])HashValue.Clone();
  466.         }
  467.  
  468.         public byte[] ComputeHash(Stream inputStream)
  469.         {
  470.             Initialize();
  471.             int count;
  472.             byte[] buffer = new byte[4096];
  473.             while (0 < (count = inputStream.Read(buffer, 0, 4096)))
  474.             {
  475.                 HashCore(buffer, 0, count);
  476.             }
  477.             HashValue = HashFinal();
  478.             return (byte[])HashValue.Clone();
  479.         }
  480.  
  481.         public int TransformBlock(
  482.             byte[] inputBuffer,
  483.             int inputOffset,
  484.             int inputCount,
  485.             byte[] outputBuffer,
  486.             int outputOffset
  487.             )
  488.         {
  489.             if (inputBuffer == null)
  490.             {
  491.                 throw new ArgumentNullException("inputBuffer");
  492.             }
  493.             if (inputOffset < 0)
  494.             {
  495.                 throw new ArgumentOutOfRangeException("inputOffset");
  496.             }
  497.             if ((inputCount < 0) || (inputCount > inputBuffer.Length))
  498.             {
  499.                 throw new ArgumentException("inputCount");
  500.             }
  501.             if ((inputBuffer.Length - inputCount) < inputOffset)
  502.             {
  503.                 throw new ArgumentOutOfRangeException("inputOffset");
  504.             }
  505.             if (this.State == 0)
  506.             {
  507.                 Initialize();
  508.                 this.State = 1;
  509.             }
  510.  
  511.             HashCore(inputBuffer, inputOffset, inputCount);
  512.             if ((inputBuffer != outputBuffer) || (inputOffset != outputOffset))
  513.             {
  514.                 Buffer.BlockCopy(inputBuffer, inputOffset, outputBuffer, outputOffset, inputCount);
  515.             }
  516.             return inputCount;
  517.         }
  518.         public byte[] TransformFinalBlock(
  519.             byte[] inputBuffer,
  520.             int inputOffset,
  521.             int inputCount
  522.             )
  523.         {
  524.             if (inputBuffer == null)
  525.             {
  526.                 throw new ArgumentNullException("inputBuffer");
  527.             }
  528.             if (inputOffset < 0)
  529.             {
  530.                 throw new ArgumentOutOfRangeException("inputOffset");
  531.             }
  532.             if ((inputCount < 0) || (inputCount > inputBuffer.Length))
  533.             {
  534.                 throw new ArgumentException("inputCount");
  535.             }
  536.             if ((inputBuffer.Length - inputCount) < inputOffset)
  537.             {
  538.                 throw new ArgumentOutOfRangeException("inputOffset");
  539.             }
  540.             if (this.State == 0)
  541.             {
  542.                 Initialize();
  543.             }
  544.             HashCore(inputBuffer, inputOffset, inputCount);
  545.             HashValue = HashFinal();
  546.             byte[] buffer = new byte[inputCount];
  547.             Buffer.BlockCopy(inputBuffer, inputOffset, buffer, 0, inputCount);
  548.             this.State = 0;
  549.             return buffer;
  550.         }
  551.         #endregion
  552.  
  553.         protected virtual void Dispose(bool disposing)
  554.         {
  555.             if (!disposing)
  556.                 Initialize();
  557.         }
  558.         public void Dispose()
  559.         {
  560.             Dispose(true);
  561.         }
  562.     }
  563. }
  564.  
  565. A mes souhaits, n'est-ce pas?
  566.  
  567. Par la suite, pour l'utiliser au sein d'une page, vous procéderez ainsi:
  568.  
  569. string api_Sig = "Hello world! My name is WP_App and you have no idea of what I'm saying!");
  570. String hash1 = MD5CryptoServiceProvider.GetMd5String(api_Sig);
  571.  
  572. Votre chaîne de caractères cryptée étant ainsi "hash1".
  573. Le tour est joué ! Je suppose que cela fonctionne également pour WinRT (et pas seulement WinPRT), du moins je peux vous assurer que ce code est testé et éprouvé par mes soins sur la plateforme mobile de Microsoft.
  574. Cette entrée a été publiée dans Windows Phone le 5 avril 2013 .
  575. Navigation des articles
  576. ← Utiliser une HP Touchpad pour déboguer vos apps Android sous Windows 8 Afficher les fichiers photos d’un dossier avec WinRT →
  577. Laisser un commentaire
  578.  
  579. Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *
  580.  
  581. Nom *
  582.  
  583. Adresse de contact *
  584.  
  585. Site web
  586.  
  587. Commentaire
  588.  
  589. Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>
  590.  
  591. Recherche pour:
  592. Articles récents
  593.  
  594.    Afficher les fichiers photos d’un dossier avec WinRT
  595.    Convertir un string en MD5 sous Windows Phone
  596.    Utiliser une HP Touchpad pour déboguer vos apps Android sous Windows 8
  597.    Mon expérience avec l’Accélérateur
  598.    Hello World !
  599.  
  600. Commentaires récents
  601.  
  602. Archives
  603.  
  604.    avril 2013
  605.    février 2013
  606.  
  607. Catégories
  608.  
  609.    à propos
  610.    Divers
  611.    Microsoft
  612.    Windows Phone
  613.    WinRT
  614.  
  615. Méta
  616.  
  617.    Connexion
  618.    Flux RSS des articles
  619.    RSS des commentaires
  620.    Site de WordPress-FR
Add Comment
Please, Sign In to add comment