• HMACSHA512


    HMACSHA 512

    在Java .NET Objective – C

    Java

    private final static String algorithm = "HMACSHA512";

     

        public static void main(String[] args) {

            String result = hmacSHA512("3e4f2550-0818-4665-9bfb-edbe9b15f586");

     

            System.out.println(result);

        }

     

        private static String hmacSHA512(String key) {

            String result = "";

     

            try {

                Calendar c = Calendar.getInstance(TimeZone.getTimeZone("UTC"));

                long unixTime = c.getTimeInMillis() / 1000;

                String data = String.valueOf(unixTime);

     

                final byte[] bytesData = data.getBytes("UTF-8");

                final byte[] bytesKey = key.getBytes();

                final SecretKey secretKey = new SecretKeySpec(bytesKey, algorithm);

                Mac mac = Mac.getInstance(algorithm);

                mac.init(secretKey);

                mac.update(bytesData);

                final byte[] macData = mac.doFinal();

     

                final long l = bytesToLong(macData);

                BigDecimal bDecimal = readUnsignedLong(l);

                BigDecimal pBigDecimal = new BigDecimal(Math.pow(10, 15));

                BigDecimal token = bDecimal.remainder(pBigDecimal);

     

                result = String.valueOf(token);

     

                return resultCheck(result);

            } catch (Exception e) {

                System.out.println(e.getMessage());

            }

     

            return result;

        }

     

        private static String resultCheck(String token) {

            while (token.length() < 15) {

                token = "0" + token;

            }

     

            return token;

        }

     

        public static long bytesToLong(byte[] b) {

            long s = 0;

            long s0 = b[0] & 0xff;

            long s1 = b[1] & 0xff;

            long s2 = b[2] & 0xff;

            long s3 = b[3] & 0xff;

            long s4 = b[4] & 0xff;

            long s5 = b[5] & 0xff;

            long s6 = b[6] & 0xff;

            long s7 = b[7] & 0xff;

            s1 <<= 8;

            s2 <<= 16;

            s3 <<= 24;

            s4 <<= 8 * 4;

            s5 <<= 8 * 5;

            s6 <<= 8 * 6;

            s7 <<= 8 * 7;

            s = s0 | s1 | s2 | s3 | s4 | s5 | s6 | s7;

            return s;

        }

     

        public static final BigDecimal readUnsignedLong(long value) throws IOException {

            if (value >= 0)

                return new BigDecimal(value);

     

            long lowValue = value & 0x7fffffffffffffffL;

            return BigDecimal.valueOf(lowValue).add(BigDecimal.valueOf(Long.MAX_VALUE)).add(BigDecimal.valueOf(1));

        }

     

    .NET

    static void Main(string[] args)

    {

    var dateTime = new DateTime(2018, 6, 1, 15, 22, 34, DateTimeKind.Utc);

    Console.WriteLine(Generate("3e4f2550-0818-4665-9bfb-edbe9b15f586", dateTime));

     

    Console.ReadKey();

    }

     

    public static string Generate(string secretKey, DateTime date)

    {

    date = date.Kind == DateTimeKind.Utc ? date : date.ToUniversalTime();

     

    var unixTime = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);

    var counter = (long)date.Subtract(unixTime).TotalSeconds;

     

    byte[] keyBytes = Encoding.ASCII.GetBytes(secretKey);

     

    ulong hash = 0;

     

    using (HMACSHA512 hmac = new HMACSHA512(keyBytes))

    {

    byte[] counterBytes = Encoding.UTF8.GetBytes(counter.ToString());

    byte[] hashBytes = hmac.ComputeHash(counterBytes);

     

    hash = BitConverter.ToUInt64(hashBytes, 0);

    }

     

    ulong token = hash % (ulong)Math.Pow(10, 15);

     

    return token.ToString("000000000000000");

    }

     

    Objective – C

    - (NSString *)generate:(NSString *)secretKey {

    NSString *counter = @"1527866554";

    NSData *counterBytes = [counter dataUsingEncoding:NSUTF8StringEncoding];

    NSData *keyBytes = [secretKey dataUsingEncoding:NSUTF8StringEncoding];

     

    NSMutableData *macOut = [NSMutableData dataWithLength:CC_SHA512_DIGEST_LENGTH];

    CCHmac( kCCHmacAlgSHA512,

    keyBytes.bytes,

    keyBytes.length,

    counterBytes.bytes,

    counterBytes.length,

    macOut.mutableBytes);

     

    unsigned long long hash = 0;

    [macOut getBytes:&hash length:sizeof(unsigned long)];

    unsigned long long token = hash % (unsigned long)pow(10, 15);

    NSString *strToken = [NSString stringWithFormat:@"%015lld", token];

    NSLog(@"secret key = %@, counter = %@, payment code = %@", secretKey, counter, strToken);

    return strToken;

    }

  • 相关阅读:
    POJ 2299 UltraQuickSort(求逆序数,归并排序或者离散化+树状数组)
    HDU 4349 Xiao Ming's Hope(数学题)
    HDU 2222 Keywords Search(AC自动机的入门题)
    HDU 4341 Gold miner(分组的背包问题)
    HDU 2825 Wireless Password(AC自动机+状态压缩DP)
    POJ 2352 Stars(树状数组)
    HDU 4342 History repeat itself(数学规律)
    HDU 4345 Permutation(数学题,记忆化搜索)
    HDU 3247 Resource Archiver(AC自动机+状态压缩DP)
    RFC
  • 原文地址:https://www.cnblogs.com/BlueEye/p/8760821.html
Copyright © 2020-2023  润新知