The hosts scored 149 for five in 19.4 overs to overcome India's sub-par total of 148 for five on a Sophia Gardens surface that offered bounce.
Virat Kohli had top scored with 47 runs off 38 balls as the visitors struggled to get going after being put into bat.
England used the short-ball tactic to good effect and tied down both Rohit Sharma (5) and Shikhar Dhawan (10).
Rohit was the first to go, trying to pull a short delivery after failing to make contact repeatedly. He skied a catch off debutant Jake Ball (1-32) in the second over and was caught behind.
First game's centurion KL Rahul (6) was in next but didn't look comfortable at the crease either.
The groundsmen left an extra layering of grass on the wicket's top-surface and English bowlers used it amply. With the short boundaries, they used short bowling against every top-order batsman.
Even an in-form Rahul couldn't contend with this tactic, thus managing to miss an off-cutter from Liam Plunkett (1-17) in the fifth over and was bowled. Three balls later, Dhawan was run out in a bizarre manner as he failed to make ground going for a quick single, and lost control of his bat at the same time.
India were reduced to 22-3 in the fifth over and only managed 31-3 in the powerplay overs. It was India's lowest powerplay total for 27 consecutive T20Is since June 2016 when they scored 29-3 against Zimbabwe in Harare.
Dhawan's dismissal had brought Suresh Raina (27 off 20 balls) and Kohli together at the crease. Despite his weakness against the short ball, the left-hander did well to help put on 57 runs for the fourth wicket with the Indian skipper.
Perhaps they were helped in this regard with Adil Rashid (1-29) coming on to bowl. Kohli, on 15 not out, survived a chance in the 11th over when he hit the leg spinner to long on only for Jason Roy to drop and push the ball past boundary for a six.
Raina and Kohli brought up their 50 off 38 balls and immediately afterwards the former upped the ante. He started looking for quick runs with his partner holding one end together.
It didn't work, as Raina was stumped off Rashid in the 13th over. Playing his 500th international game, Mahendra Singh Dhoni (32 not out off 24 balls) then came to the crease and added a quick 32 runs off 24 balls with Kohli.
A highlight of this short partnership was their running between the wickets, with pushes even to the 30-yard circle returning two runs, and they took the score past 100 in the 16th over.
Dhoni and Hardik Pandya (12 not out) then added 32 runs off 17 balls, with 22 runs coming off the last over from Ball. Chasing 149, England didn't get off to the best start as Umesh Yadav (2-36) bowled Jason Roy (15) in the third over with a beautiful inswinger.
India though desperately wanted Jos Buttler's (14) wicket, and the desperation grew when Kohli dropped him at mid-off off Umesh in the fifth over. He was on 10 not out then. Much to the Indian skipper's relief, it didn't cost much as three balls later, Buttler gave away an almost identical chance and this time Kohli held on, running to his right and sparking his customary wild celebration.
Hales and skipper Eoin Morgan (17) then added 48 runs for the fourth wicket. Even as England were in cruise mode, Hardik Pandya (1-28) provided the breakthrough against the run of play.
In fact, the wicket should be attributed to Shikhar Dhawan who took a leaping catch at fine leg boundary that stunned the crowd.
Jonny Bairstow then showed that practicing against the spin-bowling machine had paid dividends. He smacked 28 off 18 balls, and the highlight of his innings were the two tall sixes he hit off Kuldeep in the 17th over.
England crossed 100 in the 15th over, as Hales reached his eighth T20I half-century off 39 balls.